İçeriğe geç

Inheritance (Kalıtım) ve Base Keyword: OOP’de Miras Alma ve Ataya Dönüş

Şimdi bu miras alma, hani bazen aile içinde de olur ya, büyüklerden bir şeyler kalır insana. İşte programlamada da durum aşağı yukarı aynı. Bir sınıf var, biz ona ana sınıf, ata sınıf diyelim. Sonra bu ana sınıfın özelliklerini, metotlarını alıp kendine yeni bir sınıf oluşturuyorsun. Buna da alt sınıf, çocuk sınıf, mirasçı sınıf ne dersen artık. Amaç ne? Kodu tekrar yazmaktan kurtulmak, daha düzenli, daha anlaşılır hale getirmek.

Düşünsene, bir sürü ortak özelliğin var. Bir ‘Araba’ sınıfı düşün. Hepsinin tekerleği var, motoru var, rengi var. E, sen şimdi her yeni araba modeli için bu özellikleri tek tek mi yazacaksın? Yok canım, öyle bir dünya yok artık. Ana bir ‘Araba’ sınıfı oluşturur, tekerlek, motor gibi ortak şeyleri oraya koyarsın. Sonra ‘SporAraba’, ‘Kamyon’, ‘Bisiklet’ gibi sınıflar türetirsin. Spor araba da araba işte, kamyon da araba. Hepsinin o ortak özelliklere ihtiyacı var. İşte tam bu noktada inheritance devreye giriyor.

Bu inheritance olayı da öyle aman aman bir şey değil aslında. Nesne yönelimli programlamanın temel taşlarından biri yani. Bir kere alışınca, “Aa, bunu böyle mi yapsaydım?” diyeceğin çok şey olur insana. Mesela benim ilk zamanlarımda bir tane oyun geliştirmiştim, tamamen sıfırdan. Sonra bir baktım, her karakter için ayrı ayrı hareket fonksiyonları yazıyorum. Aynı şeyler, sadece ufak tefek farklar. O zamanlar bu inheritance denen şeyi bilmediğim için kendi kendime söylenip durmuştum 🙂

Peki, bu işin ‘base’ keyword’ü nerede derseniz, işte orası da işin biraz daha ince noktası. Diyelim ki sen bir alt sınıf oluşturdun ve ana sınıftan bazı özellikler aldın. Ama bazen de ana sınıftaki bir metodu kendi isteğine göre biraz değiştirmek, üzerine bir şeyler eklemek istiyorsun. Ya da tam tersi, ana sınıftaki bir metodu hiç değiştirmeden olduğu gibi kullanmak istiyorsun. İşte tam burada ‘base’ anahtar kelimesi imdadına yetişiyor.

Yani şöyle düşün: Ana sınıfın bir ‘SesÇıkar’ metodu var. Sen de bu metodun üzerine bir ‘KornaÇal’ metodu yazmak istiyorsun. Eğer sadece ‘KornaÇal’ yazarsan, ana sınıftaki ‘SesÇıkar’ metodu çağrılmaz. Sen üstüne yazmış olursun. Ama bazen dersin ki, “Ben önce ana sınıftaki ‘SesÇıkar’ metodunu çalıştırayım, ondan sonra kendi ‘KornaÇal’ metodumu da ekleyeyim.” İşte o zaman ‘base.SesÇıkar()’ dersin. Bu, “Git ana sınıftaki SesÇıkar metodunu bul ve çalıştır,” demek oluyor. Ne güzel değil mi?

Bu arada, aklıma geldi, geçenlerde bir proje üzerinde çalışırken de bu base keyword’ünü kullandım. Bir tane base sınıfım vardı, onun bir metodu vardı ve ben o metodu override (geçersiz kılma) yapıp üzerine yeni özellikler ekleyecektim ama aynı zamanda ana sınıftaki metodun da çalışmasını istiyordum. Normalde sadece üstüne yazsaydım, ana sınıftaki metot çağrılmayacaktı. İşte tam o noktada ‘base’ anahtar kelimesini kullanarak hem ana metodun işlevini korudum hem de kendi eklemelerimi yaptım. Oldukça pratik bir çözüm oldu.

Şimdi gelelim kod örneğine. Diyelim ki bir ‘Hayvan’ sınıfımız var ve bu sınıfın bir ‘SesVer’ metodu var. Sonra bu ‘Hayvan’ sınıfından türeyen bir ‘Kopek’ sınıfı oluşturacağız. Kendi ‘SesVer’ metodunda hem ana sınıftaki sesi çalacak hem de üzerine havlama ekleyeceğiz.

Önce ana sınıfımız:

public class Hayvan {     public virtual void SesVer()     {         Console.WriteLine("Bir ses çıkarılıyor...");     } }

Şimdi de türetilmiş ‘Kopek’ sınıfımız:

public class Kopek : Hayvan {     public override void SesVer()     {         base.SesVer(); // Önce ana sınıftaki sesi çalıyoruz         Console.WriteLine("Hav hav!"); // Sonra kendi sesimizi ekliyoruz     } }

Bu kodda ne yaptık? ‘Hayvan’ sınıfındaki ‘SesVer’ metodunu ‘virtual’ olarak işaretledik ki, alt sınıflar bunu geçersiz kılabilsin. ‘Kopek’ sınıfı da ‘Hayvan’ sınıfından miras aldı. ‘override’ keyword’ü ile ‘SesVer’ metodunu yeniden yazdık. Ve en önemlisi, ‘base.SesVer()’ diyerek ana sınıftaki ‘SesVer’ metodunun da çalışmasını sağladık. Sonra da kendi havlama sesimizi ekledik.

Bunu test etmek için de basit bir main metodu yazabiliriz:

public class Program {     public static void Main(string[] args)     {         Kopek benimKopegim = new Kopek();         benimKopegim.SesVer();                  // Çıktı şöyle olurdu:         // Bir ses çıkarılıyor...         // Hav hav!     } }

Yani kısacası, inheritance kodu tekrar yazmaktan kurtarıyor, daha modüler hale getiriyor. Base keyword’ü ise alt sınıftan ana sınıfa erişim sağlayarak, ana sınıftaki metotları olduğu gibi kullanmamıza veya üzerine eklemeler yapmamıza olanak tanıyor. Bu ikisi birleşince, OOP’nin gücünü daha iyi anlıyorsun sanırım. Bir de şöyle düşün, hani bazen bir oyunda karakterin özelliklerini yükseltirsin ya, işte bu da ona benziyor biraz. Mevcut bir şeyi alıp daha da geliştiriyorsun. Ne güzel değil mi?

Neticede, bu inheritance ve base keyword’ü, özellikle büyük projelerde, kodun yönetilebilirliğini ve okunabilirliğini inanılmaz derecede artırıyor. Bir kere mantığını kavradın mı, ondan sonra zaten gerisi çorap söküğü gibi geliyor. Bana göre bu tür temel kavramları iyi öğrenmek, yazılım geliştiriciliğinde sağlam bir temel oluşturuyor. Eğer daha fazla örnek görmek istersen, Google’da bu konuyla ilgili bolca örnek bulabilirsin.

Sonuç olarak, Inheritance ve Base keyword’ü, OOP’nin olmazsa olmazları arasında yer alıyor. Birbirini tamamlayan bu iki kavram, kodlarımızı daha temiz, daha anlaşılır ve daha sürdürülebilir hale getiriyor. Hele o base keyword’ü yok mu, insanın içini rahatlatıyor gerçekten. Bir nevi ataya saygı duruşu gibi düşün, ama aynı zamanda kendi kimliğini de koruyarak. İşte tam da bu yüzden bu konuları iyi anlamak, ileride karşımıza çıkacak karmaşık problemleri çözmemizde bize yardımcı olacaktır diye düşünüyorum.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.