Fihrist

29 Mayıs 2013 Çarşamba

Interface - Abstract - Class : JAVA - .NET (C#)

Interface I olsun. Abstract A olsun. A, I'dan türetilmiş. C1 ve C2 sınıfları da A'dan türetilmiş. C1 ve C2'de f fonksiyonunun farklı implementasyonları olsun. Bu fonksiyonlar da I'da declare edilmiş olsun. JAVA'da A içine bir şey yazmaya gerek olmadan C1 ve C2 sınıflarındaki f'lerin I'daki declaration'dan türediğini compiler anlıyor. .NET'te ise A, I'dan türetilmiş bir sınıf olduğu için compiler I'da declare edilen fonksiyonların A'da implemet edilmesini bekliyor. Biz de implement etmek yerine A'da abstract olarak declare ediyoruz C1 ve C2'de de override ederek implement ediyoruz. İstersek A'da da implement edebiliriz. Bunun avantajı C1 ve C2 sınıflarında implement edilen fonksiyonların ortak özellikleri varsa bunu A'da implement edip C1 ve C2'deki f'lerde A'daki fonksiyon çağırılabilir. Yalnız burda dikkat edilmesi gereken C1 ve C2'de yine override yazılırken A'da implement edilen f virtual yapılır. JAVA ilk örnek: abstract class'taki bir declaration mecburiyeti yok

public interface I {
 public void f();
}

public abstract class A implements I{
}

public class C1 extends A{
 public void f() {
  // do something
 }
}

public class C2 extends A{
 public void f() {
  // do something else
 }
}
JAVA ikinci örnek: istenirse abstract class'ta da implementation yapılabilir ve normal class'lardan çağırılabilir

public interface I {
 public void f();
}

public abstract class A implements I{
 public void f() {
  // do something
 }
}

public class C1 extends A{
 public void f() {
  super.f();
  // do something else
 }
}

public class C2 extends A{
 public void f() {
  super.f();
  // do something different
 }
}

C# ilk örnek: abstract class'ta implement'e gerek olmayan Dikkat edilmesi gereken, abstract class'taki fonksiyon abstract olmalı, implementation olmamalı. Normal class'lar da override etmeli.

public interface I {
 public void f();
}

public abstract class A : I {
 public abstract void f();
}

public class C1 : A {
 public override void f() {
  // do something
 }
}

public class C2 : A {
 public override void f() {
  // do something else
 }
}

C# ikinci örnek : abstract class'ta da implementation olan ve normal class'larda abstract'taki implementation çağırılan Dikkat edilmesi gereken, abstract class'taki fonksiyon virtual olmalı, normal class'taki fonksiyon yine override etmeli ve bu fonksyion abstract class'takini çağırabilir.

public interface I {
 public void f();
}

public abstract class A : I {
 public virtual void f() {
  // do someting
 }
}

public class C1 : A {
 public override void f() {
  base.f();
  // do something else
 }
}

public class C2 : A {
 public override void f() {
  base.f();
  // do something different
 }
}