Nesne Yönelimli Programlamada Metot Ezme: Overriding Detaylı İnceleme
Herkese merhabalar! Bugünkü kapsamlı yazımızda, Nesne Yönelimli Programlama'nın (NYP) kilit özelliklerinden biri olan ve metot geçersiz kılma veya metot ezme olarak da bilinen Overriding konusunu tüm detaylarıyla ele alacağız. Özellikle Java overriding örnekleri üzerinden bu konuyu derinlemesine inceleyeceğiz. Bir sonraki yazımızda ise metot aşırı yükleme olarak bilinen Overloading kavramına odaklanacağız. Polimorfizmin önemli bir ayağı olan overriding, nesneye yönelik tasarımda esneklik ve özelleştirme imkanı sunar.
Overriding Nedir? Alt Sınıflarda Metotların Yeniden Tanımlanması
Temel olarak overriding, bir üst sınıftan (superclass) miras alınan bir metodun, alt sınıfta (subclass) aynı isim, aynı parametre listesi ve aynı (veya daha covariant) dönüş tipiyle yeniden tanımlanmasıdır. Bu sayede alt sınıf, miras aldığı metodun davranışını kendi ihtiyaçlarına göre özelleştirebilir. Java metot geçersiz kılma, kalıtımın sunduğu güçlü bir mekanizmadır. Üst sınıftaki metot final olarak işaretlenmemişse, alt sınıflar bu metodu override etmek için serbesttirler.
Neden Overriding Kullanırız? Davranış Özelleştirme ve Polimorfizm
Overriding yapısının en temel amacı, miras alınan metotların alt sınıflara özgü davranışlar sergilemesini sağlamaktır. Bu, polimorfizm (çok biçimlilik) ilkesinin de önemli bir yansımasıdır. Farklı nesnelerin aynı metot çağrısına farklı şekillerde yanıt vermesini mümkün kılar. İşte bir Java overriding örneği:
public class Hayvan {
public void sesCikar() {
System.out.println("Hayvan sesi çıkarıyor.");
}
}
class Kedi extends Hayvan {
@Override
public void sesCikar() {
System.out.println("Miyav!");
}
}
class Kopek extends Hayvan {
@Override
public void sesCikar() {
System.out.println("Hav!");
}
}
public class TestHayvanlar {
public static void main(String[] args) {
Hayvan hayvan1 = new Kedi();
Hayvan hayvan2 = new Kopek();
hayvan1.sesCikar(); // "Miyav!" çıktısı verir
hayvan2.sesCikar(); // "Hav!" çıktısı verir
}
}
Bu örnekte, Hayvan sınıfındaki sesCikar() metodu, Kedi ve Kopek sınıflarında override edilerek her hayvanın kendine özgü ses çıkarma davranışı tanımlanmıştır.
Overriding Metot Yazma Kuralları
- Mettottaki parametreler override olan metodunki ile tam olarak eşleşmelidir. Eşleşmiyorlarsa, istemediğiniz overloading (aşırı yüklenmiş) bir metod ile karşılaşabilirsiniz.
- Metodun dönüş tipi, subclass (üst sınıftaki) ile bildirilen dönüş türüyle aynı veya bunun bir alt türü olmalıdır.
- Access Modifiers (Erişim düzeyi), override (üstüne yazılan) edilen metottan daha fazla erişim düzeyi belirlenemez, daha az kısıtlayıcı olabilir. Mesela; subclass'ta
protectedmetot override olacaksapublicolamaz,privateolabilir. - Metotlar, yalnızca alt sınıf tarafından miras alındıysa overriding yapılabilir. (Miras alma kurallarına göre aldıysa) Örneğin üst sınıfıyla aynı paket içindeki bir alt sınıf,
privateveyafinalolarak işaretlenmemiş herhangi bir üst sınıf metodunu override edebilir. - Metot override edilirse üst sınıfın hata atmasına bakmaksınız kendi hatasını fırlatabilir. (Run Time Throw Exception) .Çalışma anında fırlatabilir. Üst sınıf metodunda yoksa kendimiz Exception atmasını söyleyemeyiz.
finalolarak işaretlenmiş bir metot override edilemez.staticolarak işaretlenmiş bir metot override edilemez.- Bir metot miras alınamazsa, onu override edemezsiniz.
Örneğin:
public class TestHayvanlar {
public static void main(String[] args) {
At a = new At();
// a.yemek(); // Kullanılamaz çünkü kalıtımda gelmiyor fakat metot var private
}
}
class Hayvan {
private void yemek() {
System.out.println("Hayvanlar yemek yerler");
}
}
class At extends Hayvan { }
Overridden Metot ile super Anahtar Kelimesinin Kullanımı
Çoğu zaman, geçersiz kıldığımız bir metodun üst sınıf versiyonundaki bazı kodlardan faydalanmak isteyebiliriz. Aynı zamanda alt sınıfa özgü ek davranışlar da eklemek isteyebiliriz. Bu durumda super anahtar kelimesini kullanarak üst sınıfın orijinal metoduna erişebiliriz.
public class Hayvan {
public void yemek() {
System.out.println("Hayvan genel olarak yemek yer.");
}
public void kendiMetodum() {
System.out.println("Hayvan sınıfının kendi metodu çalıştı.");
}
}
class At extends Hayvan {
@Override
public void yemek() {
super.yemek(); // Üst sınıfın yemek metodunu çağırır
System.out.println("At özel olarak ot yer.");
}
@Override
public void kendiMetodum() {
System.out.println("At sınıfının özelleştirilmiş kendi metodu çalışıyor.");
super.kendiMetodum(); // Üst sınıfın kendiMetodum metodunu çağırır
System.out.println("At sınıfı kendi metodunun sonu.");
}
}
public class Test {
public static void main(String[] args) {
At at = new At();
at.yemek();
System.out.println("---");
at.kendiMetodum();
}
}
Kurallara Uymayan Overriding Örnekleri
class UstSinif {
protected void yemek() { System.out.println("Üst sınıf yemek yiyor."); }
public void eat() throws Exception { System.out.println("Üst sınıf yiyor."); }
public String bilgiVer() { return "Üst sınıf"; }
}
class AltSinif extends UstSinif {
// @Override
// private void yemek() { System.out.println("Alt sınıf yemek yiyor."); } // Hata: Erişim seviyesi daha kısıtlayıcı
@Override
public void eat() throws java.io.IOException { // Geçerli: Alt türde istisna
System.out.println("Alt sınıf özel yiyor ve IO hatası fırlatabilir.");
try {
throw new java.io.IOException("Yemek yeme hatası");
} catch (java.io.IOException e) {
System.err.println("Hata yakalandı: " + e.getMessage());
}
}
// @Override
// public void eat(String food) { System.out.println("Alt sınıf " + food + " yiyor."); } // Overloading, overriding değil (farklı parametre)
// @Override
// public int bilgiVer() { return 1; } // Hata: Dönüş tipi aynı veya alt türü olmalı
@Override
public void yemek() {
System.out.println("Alt sınıf kendine özgü yemek yiyor.");
}
@Override
public String bilgiVer() {
return "Alt sınıf bilgisi";
}
}
Sonuç: Overriding ile Nesne Yönelimli Tasarımda Esneklik
Bu yazımızda, Nesne Yönelimli Programlama'nın temel ve güçlü bir konsepti olan overriding kavramını detaylı bir şekilde inceledik. Java'da metot geçersiz kılma kurallarını, faydalarını ve kullanım şekillerini örneklerle anlamaya çalıştık. Polimorfizmin sağlanmasında kritik bir rol oynayan overriding, kodumuzun daha esnek, okunabilir ve sürdürülebilir olmasına katkıda bulunur. Bir sonraki yazımızda, metot aşırı yükleme (overloading) konusunu ele alarak NYP kavramlarını derinleştirmeye devam edeceğiz. Bizi takipte kalın!
Yazımızdaki kod örnekleri ve daha fazla bilgi için sitemizi ziyaret edebilirsiniz: http://latestsoftwaredevelopers.com/
Umarız bu detaylı inceleme, overriding konusunu anlamanıza yardımcı olmuştur. Bir sonraki yazımızda görüşmek üzere!