Nesne Yönelimli Programlama –4- Inheritance

Merhaba can dostlarım. Öncelikle sizleri, altı ay kadar beklettiğim için özür diliyorum…

Nesne Yönelimli Programlama makalelerimize (başlıktan da anladığınız üzere) devam ediyoruz. Bu makalemizde, OOP’nin altın kurallarından olan miras kavramından bahsediyor olacağız. Hemen bir ipucu ile başlayalım… Bu miras, tam olarak genetik miras anlamındadır. Yani ebeveynden çocuğa geçen göz rengi gibi. Biz de class’ lar arasında bu tarz bir bağ kurarak bir class içindeki özellik ve metodları, başka bir class’a aktarabiliyoruz. Teknik olarak, miras veren class’a base (temel) class, miras alan class’a ise derived (türetilmiş) class diyoruz.

Inheritance, basitçe bir class’dan başka class’lar türetmektir. Peki, bu bizim ne işimize yarar? Neden bir class’dan başka class’lar türetelim ki? Bu sorunun cevabı, tahmin edeceğiniz gibi günlük hayatta yer alıyor sevgili yazılım aşıkları. Şöyle bir düşünün; insanlar, günlük hayatında kullandıkları nesneleri kategorize eder ve geneller. Ne demek istediğimi şöyle anlatayım; öğlen yemeğinizi bitirdiniz ve iş yerinize dönüyorsunuz. O sırada bir arkadaşınızla karşılaştınız. Arkadaşınız, nereden geldiğinizi sorduğunda ona “kuru-pilav yemekten” demek yerine “öğlen yemeğinden” dersiniz.İşte genellediniz! Veya başka bir örnek şöyle olabilir. Bir bilim-kurgu filmi almaya DVD mağazasına girdiniz. Bu mağaza sizin için ürünleri kategorilemiştir. Mağazadan içeri girdiğinizde Müzik ve Film kategorisi arasında seçiminizi yaparsınız önce. Daha sonra Film kategorisi içinden Bilim-Kurgu kategorisini bulur, oradan da aradığınız filme ulaşırsınız. Bir de bilimsel bir örnek verelim, bilim adamlarının bir çoğu, uzman oldukları alanlarda, genelleme ve özelleştirme yaparlar (Bu noktada inheritance konusunu bilen/duyan bazı arkadaşlar, biyologların canlı-hayvan-memeli-maymun kategorisi gibi bir örnek vereceğimi sanıyorlar ama yanılıyorlar ). Örneğin dil bilimciler (yaaa demedim mi ben?), dünya dillerini üç kategoriye ayırırlar (Tek heceliler,sondan eklemeli diller ve çekimli diller ). Yani genellerler. Ama bir genelleme aynı zamanda özelleştirmedir de, Gidiş yönünüze göre değişir.

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. Onu da bir sonraki makaleye bırakalım.

Kendinize iyi bakın. Bol nesne modellemeli günler diliyorum.

10 thoughts on “Nesne Yönelimli Programlama –4- Inheritance

  1. birader ellerine saglikta, su ornekler var ya, onlari biraz daha farkli bir sektorden secsen diyorum. burada yabaan ellerde izgara, kavurma,haslama,sote(uuhhh) falan nerden bulucam.:)
    neyse tekrar eline saglik brader. gelince sizde bu ornekleri bana bilahare yaparsin artik 🙂

  2. Çok güzel özetlemişsiniz hocam. Elinize sağlık, Allah razı olsun sizden. Ben, yazılarınızı (biraz gecikmeli de olsa) severek okuyorum. Umarım yeni yazılarınızı da okumak kısmet olur.

  3. Hocam çok iyi ders teşekkürler lakin şöyle bir hata alıyorum:

    yemek adında bir tanım zaten var diyor.Yani şurayı kabul etmiyor "EtYemekleri:Yemek" .

    Teşekkürler

  4. Türkay hocam 2020 yılından selamlar, üniversitemde oop dersine ait bir proje geliştirmek için, sizden yararlanıyorum henüz 4. dersteyim ama örnekler ve anlatım fevkalede bu yüzden teşekkür etmeyi size borç bildim sağlıcakla kalın.

Leave a Reply