Inheritance (Kalıtım)
Inheritance
(Kalıtım), Object
Oriented Programing felsefesinin 3 temel taşından biridir.
Programlama yaparken yaptığımız olay aslında, gerçek hayattaki nesneleri
modellemektir. İşte nesneler arasındaki bu ilişkiyi, programdaki nesnelerimize
uygulama olayına kalıtım deriz. Temelde belirttiğimiz ilişki, “is a” ya da “has
a” ilişkisidir aslında.
Örnek;
Bir şirketteki Personeller için bir
sınıf yazacağımızı düşünelim. Basit olarak, tüm personellerin sicil numarası,
ad ve maaş bilgilerinin tutan bir sınıf tasarlayalım.
class Personel
{
long _sicilNo;
string _ad;
double _maas;
public long SicilNo
{
get { return _sicilNo; }
set { _sicilNo =
value; }
}
public string Ad
{
get { return _ad; }
set { _ad = value; }
}
public double Maas
{
get { return _maas; }
set { _maas = value; }
}
public Personel(int sicilNo, string ad, double maas)
{
SicilNo = sicilNo;
Ad = ad;
Maas = maas;
}
}
|
Şimdi de Müdür sınıfı tasarlamaya
çalışalım. Müdür’ün de sicil numarası, adı ve maaşı mevcuttur. Aynı zamanda; müdür
de bir personeldir. İşte bu noktada Müdür sınıfımızı tasarlarken “Müdür is
a Personel” ilişkisini belirtmeye çalışalım.
class Mudur : Personel
{
string
_sorumluOlduguDepartman;
public string
SorumluOlduguDepartman
{
get { return _sorumluOlduguDepartman;
}
set {
_sorumluOlduguDepartman = value; }
}
public Mudur(long sicilNo, string ad, double maas, string
sorumluOlduguDepartman)
: base(sicilNo, ad, maas)
{
SorumluOlduguDepartman
= sorumluOlduguDepartman;
}
}
|
Yukarıdaki tasarım ile Mudur’un de
bir Personel olduğunu belirtmiş olduk. Bu sayede hem daha doğru bir tasarım
yaptık, hem de sicilNo, ad, maas gibi alanları tekrar tanımlama gereği
duymadık. Burada görmemiz gereken diğer bir kavram da “base” anahtar
sözcüğüdür. burada base anahtar sözcüğünü kullanarak constructor yönlendirmesi
yaptık. Böylece, zaten personel sınıfında varolan sicilNo, ad ve maas
field’larının Personel sınıfından gelmesini sağlamış olduk.
Şimdi Program tarafında bu iki
sınıfın nesnelerini oluşturalım.
class Program
{
static void Main(string[] args)
{
Personel pers = new Personel(123456789, "onur", 5000);
Mudur mdr = new Mudur(987654321, "ali", 8000, "ARGE");
}
}
|
! Burada akıllara bir soru gelebilir. Madem Mudur de bir
Personeldi, o halde bir mudur nesnesi personel tipinden bir değişkende
tutulabilir mi? Elbette tutulabilir. Zaten bu, kalıtımın bize sağladığı bir
özelliktir.
class Program
{
static void Main(string[] args)
{
Personel pers = new
Mudur(987654321, "ali",
8000, "ARGE");
}
}
|
Bu noktada da başka bir sorun ile
karşı karşıyayız. Yukarıdaki kod parçasına göre; pers. dediğimizde, new ile
örneklediğimiz nesnemiz “Mudur” tipinden olmasına rağmen “sorumluOlduguDepartman” property’sini göremeyeceğiz. Bunun sebebi
ise tip güvenliğinin korunmasıdır. nesneyi tutan değişkenin tipi “Personel”
dir. Dolayısı ile bu işaretçi üzerinden, sadece o işaretçi tipinin üyelerine
erişebiliriz.
! Eğer “sorumluOlduguDepartman”
property’sine ulaşmak istersek, pers değişkeni üzerinde cast işlemi yapmamız gerekmektedir.
((Mudur)pers).SorumluOlduguDepartman = "Hardware";
|
Yorum Gönder Blogger Facebook