Java - Kalıtım #5 Abstract Sınıfları Kullanmak ( Özet/Soyut)

Çarşamba, Mayıs 13, 2015 kustemura 0 Yorum


Bir sınıf hiyerarşisinde , alt sınıfa ait bir method üst sınıfında ki bir method ile aynı tipe ve ada sahipse ve böyle bir method çağrıldığında her zaman methodun alt sınıf tarafından tanımlanan versiyonuna başvurulur.Üst sınıftaki method gizlenmiş olur.Bunu bir örnek ile inceleyelim. Önceki yazılarımda  Java - Kalıtım konularını işlemiştik. Şimdi kaldığımız yerden devam ediyoruz.Eğer bu konu hakkında pek bir bilginiz yok ise önceki konulara bakmakta yarar var.

Önceki örneklerimizde kullandığımız yapıların hepsinde içeriği hep üst sınıf tarafından doldurulan ve ona eklemeler yapan alt sınıfları incelemiştik.Bazen yalnızca alt sınıflar tarafından paylaşılacak ve içeriği onlar tarafından doldurulacak , genel bir form tanımlayan üst sınıflar oluşturmak isteyebilirsiniz.Böyle bir sınıf , alt sınıfların gerçekleştirmek zorunda olduğu methodların doğasını belirler.
Bu durumda alt sınıfın gerçekten de tüm gerekli methodları ezmesini sağlamak için bir yol olması gerekir.Java bu problemi özet-soyut method ( abstract method ) kavramı ile çözer.
Özet bir method deklara etmek için aşağıdaki genel form kullanılır.

abstract tip_adi ( parametre listesi );

Gördüğünüz gibi , bir method gövdesi yoktur.
Bir sınıfı özet olarak deklere etmek için class anahtar sözcüğünün sol tarafında abstract anahtar sözcüğünü kullanmak yeterlidir.
Anlattığım şeyleri bir örnek üzerinde inceleyelim.

abstract class A {
 abstract void callMe();

 void callMeToo() {
  System.out.println("Bu bir somut methoddur.");
 }
}

class B extends A {
 @Override
 void callMe() {
  System.out.println("B A'daki callMe() methodunu içermek zorundadır. ");
 }
}

class AbstractDemo {
 public static void main(String args[]) {
  final B b = new B();
  b.callMe();
  b.callMeToo();
 }
}
Programın Çıktısı : 
B A'daki callMe() methodunu içermek zorundadır. 
Bu bir somut methoddur.
Programda A sınıfından bir nesne deklare edilmediğine dikkat edin.Özet bir sınıfı örneklendirmek mümkün değildir.Bir başka nokta : A sınıfı callMeToo() adında somut bir method'a sahiptir.Özet sınıflar örneklendirmek için kullanılamazlar , sadece nesne referansları oluşturmak için kullanılabilirler.Çünkü Java'nın çalışma zamanı çok biçimliliğine yaklaşımı , üst sınıf referansları aracılığıyla gerçekleşir.Bu yüzden bir alt sınıf nesnesine işaret etmek üzere , özet bir sınıfa referans oluşturmak mümkündür. Bunu bir örnek ile ele alalım.
abstract class Figure {
 double dim1;
 double dim2;

 Figure(double a, double b) {
  dim1 = a;
  dim2 = b;
 }

 abstract double area();
}

class Rectangle extends Figure {
 Rectangle(double a, double b) {
  super(a, b);
 }

 @Override
 double area() {
  System.out.println("Dikdörtgen'in İç Alanı ");
  return dim1 * dim2;
 }
}

class Triangle extends Figure {
 Triangle(double a, double b) {
  super(a, b);
 }

 @Override
 double area() {
  System.out.println("Üçgen'in İç Alanı ");
  return dim1 * dim2 / 2;
 }
}

class AbstractAreas {
 public static void main(String args[]) {
  // Figure f = new Figure(10,7); Geçersiz , oluşturulamaz.
  final Rectangle r = new Rectangle(5, 2);
  final Triangle t = new Triangle(3, 7);
  Figure figureReference;
  figureReference = r;
  System.out.println(figureReference.area());
  figureReference = t;
  System.out.println(figureReference.area());
 }
}
Programın Çıktısı:
Dikdörtgen'in İç Alanı 
10.0
Üçgen'in İç Alanı 
10.5
Gördüğünüz gibi , area() methodu abstract bırakılmıştır . Çünkü area() hesaplaması için her nesne farklı bir method kullanmaktadır.Dikdörtgenin iç alanı formülü ile Üçgenin iç alanı formülü farklı olduğu için aynı methodu kullanamayız.area() methodunu abstract oluşturmamız nedeni budur.Üst sınıf tarafından abstract oluşturulan methodlar alt sınıflar tarafından kendi içlerinde farklı özelliklerde oluşturulmak için tasarlanmıştır.

0 yorum :