Biz de; programlarımızda, bazı nesneleri kategorize etmek isteyebiliriz değil mi? İşte o zaman inheritance'in nimetlerinden faydalanıyoruz. Peki teknik olarak inheritance bize ne katıyor? Gelelim o konuya...
Class'lar arası inheritance uygulamamızın en makul sebebi, "kod maliyetini azaltmak" (yani daha az kod yazmak ) olacaktır. Biraz daha açmak gerekirse; birbirleriyle benzer classları ayrı ayrı yazmak yerine, ortak üyeleri belirleyerek bir base class oluşturmak ve geri kalanlarını bu base'den türetmek çok daha pratik bir çözüm olacaktır.
Biliyorsunuz ki .NET'de tüm tipler object'den türer. Burada bahsedilen türeme de, inheritance konusuna işaret etmektedir. Aşağıdaki resimde object tipinde bir değişkenin metodlarını görmektesiniz:
Peki, inheritance konusunda söylediğim doğruysa ve tüm tipler bu object'den türüyorsa, herhangi bir .NET tipinde de, object metodlarını bulabilmeliyim değil mi?
İşte kanıt! Dilerseniz, siz de başka tipler ile bu testi yapabilirsiniz.
Tamam, .NET kütüphanesinde tüm tiplerin, object tipinden türediğini gözlerimizle gördük. Şimdi sıra kendi tiplerimiz arasında miras uygulamaya geldi.
Aslında bunu yapmadan önce türeten – türetilen ilişkisinin (base-derived) nasıl modellenebileceği konusunda biraz konuşmak istiyorum. Kimin base kimin derived olduğuna nasıl karar vereceğiz? Cevap çok basit! Nesneler arasında, bir tanımlama cümlesi kurabiliyorsanız, aralarında inheritance ilişkisi var demektir. Örneğin:
"Pırasa bir sebzedir" cümlesi, bir tanımlama cümlesidir. Burada iki nesne bulunuyor, "pırasa" ve "sebze". Demek ki sebze base class, pırasa ise derived class olacaktır. Bir başka bir örnek daha, "Kamyonet bir arabadır". Dayanamayacağım bir örnek daha vereceğim, "Yazılım eğitmeni bir eğitmendir" ( Bu yaklaşım, ingilizce "... is a ..." relationship olarak bilinir. Türkçesi biraz komik duruyor: ... bir .... 'dir. ).
Biz modellememizde, bir restoranın kullanacağı bir yazılımda yer alacak olan class'lar arasında inheritance uygulayacağız. Bir müşteri, restorana gittiğinde masasında hangi çeşitler olur?
Genelleyelim; Yemek, içecek ve tatlı. Şimdi bunları özelleştirelim. Yemek; Et Yemekleri, ara sıcaklar, sulu yemekler. İçecek; alkollü, alkolsüz. Formülümüzü uygulayalım, "Et yemeği (derived) bir yemektir(base)".
Ohh... Anlattım rahatladım. Hadi yazalım şunu!
İşte yemek class'ım hazır. Şimdi, derived class oluşturalım:
Şişman adam'dan ancak bu kod beklenirdi zaten! Nasıl miras aldığıma dikkat edin; class isminin yanında ':' işareti ve ardından base classımın adı. Peki ne elde ettik? Görelim:
İşte bu! Yemek class'ı içinde yazmış olduğum metod ve özelliklerin tamamı EtYemekleri class'ı na aktarıldı. Böylece ortak olan alanları, genelleme yoluyla ayırabilir ve yemek class'ından istediğim kadar class türetebilirim...
Gördüğünüz gibi dostlarım, nesneler arası ortak olan metodları, özellikleri ve olayları bir base class altında toplayarak; düzenli bir modelleme oluşturdum. Şimdi kavramı daha da iyi anlayabilmek adına, Windows Application platformundan bir örnek vermek istiyorum. Biliyorsunuz ki, Form nesnesi üzerinde bir çok kontrol (TextBox,Button,Label vs.) kullanabilirim. Bu kontrollerin tümünde varolan bazı özellikler var. Mesela, BackgroundColor, Text, ForeColor bunlardan sadece bir kaçı. Bakın Microsoft ne yapmış? Bu ortak özelliklerin tümünü, Control diye bir class içinde toplamış. Sonra Button, Label, TextBox gibi kontrollerin tümünü bu Control classından türetmiş. İşte, bizim de yaptığımız tam olarak böyle bir modelleme...
Söz modellemeye gelmişken, küçük ve güzel bir ipucu vermek istiyorum. Bazen nesneleri görerek tasarlamak işimizi çok kolaylaştırır. Bakın, Visual Studio'da bizim için çok kullanışlı bir class diagram alanı var. Gelin, bir göz atalım:
Solution Explorer penceresinden Projeye sağ tıklatıp açılan menüden View Class Diagram seçeneğini işaretlerseniz, projedek class'larınızın görsel tasarımını görürsünüz. Ben biraz temizlik yapıp aşağıdaki görüntüyü elde ettim:
Bu şekilde, modellemeyi görerek çalışmak, bazen çok daha eğlenceli/anlaşılır/pratik oluyor sevgili arkadaşlar. Kesinlikle tavsiye edilir.
Şimdi, dikkatinizi bir yere çekmek istiyorum... Eminim ki, bir çok okurum, Yemek isimli base class içinde yer alan SunumSekli metoduna dikkat etmişlerdir. İçeriğinde "mevsim yeşillikleri, yanında pilav ile" yazıyor. Peki, menümdeki tüm yemekler aynı şekilde mi sunulacak? Elbette ki hayır. Yani, bazı metodlar ve özellikler; base class'da yazıldıkları gibi kullanılmak zorunda değiller. Peki bu durumu nasıl düzelteceğiz? Her yemeğin bir SunumSekli() vardır ama bunların her birinin içeriği aynı olamaz. Base class'da bulunan Metodun ya da özelliğin, derived class içinde yeniden düzenlenmesi gerekebilir. İşte bu da, polymorphism (çok biçimlilik) konusuna giriyor.
Kaynak:turkayurkmez.com
Hiç yorum yok:
Yorum Gönder