Üye Erişimi ve Kalıtım [2]

Üye Erişim ve Kalıtım
-----------------------------------------------------------
Sınıf Üyelerinin izinsiz kullanımlarını veya gereksiz yere kurcalanmalarını önlemek için sınıf
üyeleri genellikle private olarak deklare edilir. Bir sınıfı kalıtım yoluyla aktarmak, bu private
erişim kısıtlamasını çiğnemez. Böylece, bir türetilmiş sınıf kendi temel sınıfının tüm üyelerini
içerse dahi, temel sınıfın private olarak deklare edilmiş üyelerine erişemez.
Örneğin; eğer width ve height, TwoDShape içinde, aşağıda gösterildiği gibi, private olarak
deklare edilseydi, Triangle'ın bunlara erişmesi mümkün olmayacaktı:

// private uyeler kalıtım yoluyla aktarılamaz
// Bu ornek derlenmyecektir.
using System;
//Ikı boyutlu nesneler için bir sınıf.
class TwoDShape {
double width; // artık ozel
double height; // artik ozel
public void showDim(){
Console.WriteLine("width and height are " + width + " and " + height);
}
}
// Triangle, TwoDShape2ten turetilir.
class Triangle : TwoDShape {
public string style; // ucgenin sekli
// Ucgenin alanini dondur.
public double area() {
return width * height / 2; // Hata, private üyeye erisemez.
}
// Ucgenin seklini goster.
public void showStyle() {
Console.WriteLine("Triangle is " + style);
}
}

Triangle sınıfı derslenmeyecektir, çünkü area() metodu içindeki width ve height'a
yönelik referanslar erişimin çiğnenmesine neden olur. width ve height şimdi private oldukları için
artık yanlızca kendi sınıflarının diğer üyeleri tarafından erişilirler. Türetilmiş sınıflar bunlara
erişim hakkına sahip değildir. İlk bakışta bunun ciddi bir kısıtlama olduğunu düşünebilirsiniz. Ancak
c# çeşitli çözümler sağlamaktadır. Bunlardan biri, protected (korumalı) üyeler kullanmaktır. protected
üyeler sonraki başlıkta anlatılacaktır. İkinci bir çözüm ise private verilere eişim sağlamak
amacıyla public özellikler ya da metodlar kullanmaktır. Aşağıda TwoDShape sınıflarının width ve
height üyeleri özellik haline getirilerek yeniden yazılmış versiyonunu görmektesiz.

// private uyeleri ayarlamak ve almak icin ozellik kullanir.
using System;
// Iki boyutlu nesneler icin bir sinif
class TwoDShape {
double pri_width; // artik ozel
double pri_height; // artik ozel
// width ve height icin ozellikler
public double width {
get { return pri_height; }
set { pri_height = 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 turetilmis bir sinif.
class Triangle : TwoDShape {
public string style; // ucgenin sekli
// Ucgenin alanini dondur.
public double area() {
return width*height / 2;
}
//Ucgenin seklini goster.
public void showStyle() {
Console.WriteLine("Triangle is " + style);
}
}

class Shapes2 {
public static void Main() {
Triangle t1 = new Triangle();
Triangle t2 = new Triangle();
t1.width = 4.0;
t1.style = "isosceles";
t2.width = 8.0;
t2.height = 12.0;
t2.style = "right";
Console.WriteLine("Area is " + t1.area());

Console.WriteLine();
Console.WriteLine("Info for t2: ");
t2.showStyle();
t2.showDim();
Console.WriteLine("Area is " + t2.area());
}
}

Temel ve türetilmiş sınıflara referansta bulunurken kimi zaman üst sınıf (superclass)
ve alt sınıf (subclass) terimleri kulanılır. Bu terimler Java programlamasından gelmektedir.
Java da alt sınıf denilen C#'ta türetilmiş sınıf, Java da üst sınıf denilen C#'ta temel sınıf
olarak adlandırılmaktadır.

Kaynak: Herberth Schildt
Herkes İçin C#

Hiç yorum yok:

Yorum Gönder