Çok Katmanlı Hiyerarşi Oluşturmak [8]

Şu ana dek, yalnızca bir temel sınıf ve türetilmiş sınıftan oluşan basit sınıf hiyerarşisini kullanmaktayız. Ancak, istediğiniz kadar çok sayıda kalıtım katmanı içeren hiyerarşiler inşa edebilirsiniz. Önceden de bahsedeildiği gibi, bir türetilmiş sınıfı bir başkasının temel sınıfı olarak kullanmak tamamen geçerlidir. Örneğin A,B ve C adında üç sınıfın verildiği varsayılarak C, B'den; B'de A'dan türerilebilir. Bu tür bir durum söz konusu olduğunda, türetilmiş sınıfların her biri kendi temel sınıflarının tümünde yer alan özelliklerin tümünü kalıtım yoluyla elde eder.
Bu örnekte C, B ve A'nın tüm özelliklerini kalıtım yoluyla sahip olur. Çok katmanlı hiyerarşinin nasıl kullanışlı olabileceğini anlamak için aşağıdaki programıele alın. Bu programda Triangle adındaki türetilmiş sınıf, ColorTriangle adında türetilmiş sınıfı oluşturmak için temel sınıf olarak kullanılmaktadır. ColorTriangle, Triangle ve TwoDShape'in tüm özelliklerini kalıtım yoluyla elde ettiği gibi, üçgenin rengini tutan color adında bir de alan eklemektedir.

// Cok katmanli bir hiyerarsi.
using System;
class TwoDShape {
double pri_width; // private
double pri_height; // private
// varsayilan yapilandirici.
public TwoDShape() {
width=height=0.0;
}
// TwoDShape icin yapilandirici.
public TwoDShape(double w, double h) {
width=w;
height=h;
}
// Esit width ve height degerlerine sahip bir nesne yapilandir.
public TwoDShape(double x) {
width=height=x;
}
//width ve height 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
/* Varsayilan yapilandirici.
Bu, TwoDShape'in varsayilan yapilandiricisini cagirir. */
public Triangle() {
style="null";
}
// Yapilandirici
public Triangle(string s, double w, double h) : base(w, h) {
style=s;
}
// Bir ikizkenar ucgen yapilandir.
public Triangle(double x) : base(x) {
style="isosceles";
}
// Ucgenin alanini dondur.
public double area() {
return width*height/2;
}
// Ucgenin seklini goster.
public void showStyle() {
Console.WriteLine("Triangle is " + style);
}
}

// Triangle'i genislet.
class ColorTriangle : Triangle {
string color;
public ColorTriangle(string c, string s, double w,
double h) : base(s, w, h) {
color=c;
}
// Rengi goster.
public void showColor() {
Console.WriteLine("color is " + color);
}
}

class Shapes6 {
public static void Main() {
ColorTriangle t1=new ColorTriangle("Blue", "right", 8.0, 12.0);
ColorTriangle t2=new ColorTriangle("Red", "isosceles", 2.0, 2.0);
Console.WriteLine("Info for t1: ");
t1.showStyle();
t1.showDim();
t1.showColor();
Console.WriteLine("Area is " + t1.area());
Console.WriteLine();
Console.WriteLine("Info for t2: ");
t2.showStyle();
t2.showDim();
t2.showColor();
Console.WriteLine("Area is " + t2.area());
}
}

Bu programın çıktısı aşağıdaki gösterilmiştir.

Info for t1:
Triangle is right
width and heighr are 8 and 12
Color is Blue
Area is 48

Info for t2:
Triangle is isosceles
Width and height are 2 and 2
Color is Red
Area is 2

Kalıtımdan ötürü ColorTriangle, önceden tanımlı Triangle ve TwoDShape sınıflarından yararlanabilir. ColorTriangle'in yalnızca kendisine özgü, spesifik uygulama için gerek duyduğu ekstra enformasyonu eklemesi yeterlidir. Bu, kalıtımın öneminin bir parçasıdır; kodun yeniden kullanımına olanak tanır.
Bu örnek, bir diğer önemli hususu daha açıklamaktadır: base daima kendisine en yakın temel sınıf içindeki yapılandırıcıyla ilişkilidir. ColorTriangle içindeki base, Triangle içindeki yapılandırıcıyı çağırır. Bir sınıf hiyerarşisinde eğer bir temel sınıf yapılandırıcısı parametre gerektirirse, tüm türetilmiş sınıflar bu parametreleri "yukarıya doğru" aktarmalıdır. Türetilmiş sınıfın kendisiparametre gerektirsin yada gerektirmesin bu durum geçerlidir.

Kaynak: Herbert Schildt
Herkes için C#

Hiç yorum yok:

Yorum Gönder