Yapılandırıcılar ve Kalıtım [4]

Bir hiyararşi içinde, hem temel sınıfların hem de türetilmiş sınıfların kendi yapılandırıcılarına sahip olmaları mümkündür. Bu ortaya önemli bir soru atar: Türerilmiş bir sınıfın bir nesnesini yapılandırmaktan hangi yapılandırıcı sorumludur? Temel sınıf içindeki mi, türetilmiş sınıf içindeki mi, yoksa her ikisi de mi?
Yanıt: Nesnenin temel sınıfa ait parçaları temel sınıfın yapılandırıcı tarafından, türetilmiş sınıfa ait parçaları türetilmiş sınıfın yapılandırıcısı tarafından yapılandırılır. Çünkü temel sınıfın, türetilmiş sınıf içindeki öğeler ve öğelere erişim hakkında bilgisi yoktur. Bu nedenle, her iki sınıfın yapılandırıcıları ayrı olmalıdır. Önceki örnekler C# tarafından otomatik olarak oluşturulan varsayılan yapılandırıcılara dayanıyordu. Ancak, pratikte birçok sınıfın yapılandırıcısı vardır. Burada, bu durumun nasıl kontrol altına alındığını göreceksiniz.

Yalnızca türetilmiş sınıfın içinde bir yapılandırıcı tanımlanırsa, söz konusu süreç basittir ve sadece rüretilmi sınıfın nesnesini yapılandırmaktan ibarettir. Nesnenin temel sınıfla ilgili parçası varsayılan yapılandırıcı tarafından otomatik olarak yapılandırılır.
Aşağıda Triangle'nin üzerinde çalışılmış versiyonu. Bu kez Triangle içinde bir yapılandırıcı tanımlanmaktadır.
Ayrıca, style da private hale getirilmiştir çünkü style'ın değeri artık yapılandırıcı tarafından verilmektedir.

// Triangle'a bir yapilandirici eklemek.
using System;
// Iki boyutlu nesneler icin bir sinif.
class TwoDShape {
double pri_width; // private
double pri_height; // private
// width ve height icin ozellikler.
public double width {
get { return pri_width; }
set { pri_width=value; }
}
public double height {
get { return pri_height; }
set { pri_height=value; }
}
public void showDim() {
Console.WriteLine("width and height are " + width + " and " + height);
}
}

// Ucgenler icin TwoDShape'ten turetilen bir sinif.
class Triangle : TwoDShape {
string style; // ozel
// Yapilandirici
public Triangle(string s, double w, double h) {
width=w; // temel sinifi ilk kullanima hazirla
height=h; // temel sinifi ilk kullanima hazirla
style=s; // turetilmis sinifi ilk kullanima hazirla
}
// Ucgenin alanini dondur.
public double area() {
return width * height / 2;
}
// Ucgenin seklini goster.
public void showStyle() {
Console.WriteLine("Triangle is" + style);
}
}

class Shapes3 {
public static void Main() {
Triangle t1=new Triangle("isosceles", 4.0, 4.0);
Triangle t2=new Triangle("right", 8.0, 12.0);
Console.WriteLine("Info for t1: ");
t1.showStyle();
t1.showDim();
Console.WriteLine("Area is " + t1.area());
Console.WriteLine();
Console.WriteLine("Info for t2: ");
t2.showStyle();
t2.showDim();
Console.WriteLine("Area is " + t2.area());
}
}

Bu örnekte Triangle'ın yapılandırıcısı, kalıtım yoluyla kendi style alanlarını da birlikte getiren
TwoDShape'in üyelerini ilk kullanıma hazırlar.
Hem temel sınıfta hemde türetilmiş sınıfta yapılandırıcı tanımlanınca söz konusu süreç biraz daha karmaşık hale gelir, çünkü bu kez hem temel sınıfın hem de türerilmiş sınıfın yapılandırıcıları
çalıştırılmalıdır. Bu durumda C#'ın bir başka anahtar kelimesini kullanmalısınız: base. base'in iki
kullanım şekli vardır. Birinci kullanımı, temel sınıfın yapılandırıcısını çağırmaktır. İkinci kullanımı ise temel sınıfın, türerilmiş sınıfın bir üyesinden gizlediği üyesine erişmek içindir. Daha sonraki bölümlerde bunları inceleyeceğiz.

Kaynak: Herbert Schildt
Herkes için C#

Hiç yorum yok:

Yorum Gönder