Overload ve Override

Bu yazımızda overlad ve override kavramlarına değineceğiz. Bu kavramlar varolan methodların çalışma şeklini değiştirmek veya methodun alternatif şekillerde çalışabilmesini sağlamak üzere kullanılmaktadır.

Overload

Bunun için bir fabrika örneği üzerinden ilerleyelim. Varsayalım ki bu fabrikada bir üretim hattımız olsun. Hattın üzerinde ise montaj yapan bir robot platformu olsun. Fabrikamızın ilk kuruluşunda montaj hattına belirli nitelikleri olan bir robot kol eklendiğini düşünelim.

Öncelikle bu durumu, sadece montaj yapan robotu, temsili olarak kodlayalım. 10 – Overload-Override isimli projemizin içerisinde AssemblyRobot isminde bir sınıfı kodlayarak gösterelim.

public class AssemblyRobot {

	public void assemble() {
		System.out.println("AssemblyRobot.assemble()");
	}

}

Zaman içerisinde bu montaj hattında bazı özelleşmelere ihtiyaç duyulduğunu düşünelim. Örneğin robotlarda bir değişiklik yapılarak, eskiden sürekli çalışan robotların, isteğe göre n defa çalışması sağlanmış olsun. Yeni durumda robotun hem durmadan montaj yapabilmesini, hem de belirli sayıda montajı yapıp durmasını sağlamış oluyoruz. Bunun için robota kaç kere çalışacağını söyleyebilmemiz gerekiyor. Bu durumda montaj işini yapan methodun ikinci bir versiyonunu yazmamız gerekecek. Bu versiyon parametre olarak çalışma sayısını almalı.

public class AssemblyRobot {

	public void assemble() {
		System.out.println("AssemblyRobot.assemble()");
	}
	
	public void assemble(int counter) {
		
		for (int i = 0; i < counter; i++) {
			System.out.println("AssemblyRobot.assemble() [Overloaded method]");
		}
	
	}

}

Burada görüldüğü üzere geri dönüş tipi void olan ve ismi assemble olan iki adet methodumuz bulunmaktadır. Bunlardan birisi parametre alırken diğeri almamaktadır. Peki bu durumda assemble() methodu çağırıldığında bunlardan hangisi çalışır? Bunu test etmek için TestClass sınıfımızı oluşturup, main methodunu kullanabiliriz.

public class TestClass {

	public static void main(String[] args) {
		
		AssemblyRobot assemblyRobot = new AssemblyRobot();
		
		assemblyRobot.assemble();
		assemblyRobot.assemble(3);
	}
}
Çıktı:
AssemblyRobot.assemble()
AssemblyRobot.assemble() [Overloaded method]
AssemblyRobot.assemble() [Overloaded method]
AssemblyRobot.assemble() [Overloaded method]

Görüldüğü üzere parametre verildiğinde parametreli method, parametre verilmediğinde ise parametresiz method çalışır.

İşte bu şekilde methodu farklı farklı inputlar ile çalışır hale getirmeye overload işlemi ismi verilir. IT dünyasında bu eylem “overload etmek” şeklinde telaffuz edilmektedir. Bir methodu overload etmek için farklı yöntemler izlenebilir. Aşağıdaki 3 madde overload işlemi için sergilenebilecek yaklaşımlardır.

  • Parametre sayılarının değişmesi
  • Parametre sayıları aynı iken parametre tiplerinin değişmesi
  • Methoda gönderilen parametrelerin sıralarının değişmesi (Tiplerin sıralamasının değişmesi)

Siz de bu yaklaşımları kullanarak methodunuzu overload edebilirsiniz. Bir method birden fazla defa overload edilebilir. Biz az önce ilk yaklaşımı kullanarak overload işlemini gerçekleştirdik. Diğer iki yaklaşım için kolları sıvama sırası sizde.

Override

Daha evvel override kavramı ile farklı yazılarımızda karşılaşmıştık. Ancak bunları ya daha sonra değinmek üzere incelememiştik ya da override işleminin varlığından hiç bahsetmemiştik. Override işlemi temel olarak aynı isimde ve aynı parametreleri alan iki methodun varlığının ifade edilmesidir. Methodlardan birisi üst/ata sınıflardan gelirken, diğer ise alt/çocuk sınıflarda bulunmaktadır. Override işlemi bir alt sınıfın, üst sınıfın methodlarını özelleştirmesini sağlamaktadır. Böylece üst sınıftan gelen özelliği tamamen değiştiriebilme yeteneğine kavuşuruz.

Örneğin bu ihtiyaç ilk dönemlerde sadece montaj yapan robotların ilerleyen zamanlarda kaynak yapabilme yeteneğine sahip olması şeklinde adreslensin. Bu ihtiyacı çözmek için AssemblyRobot sınıfını extend eden yeni bir sınıf yazacağız ve ismini WeldingRobot olarak belirleyeceğiz.

public class WeldingRobot extends AssemblyRobot {

}

Sınıfımızı boş şekilde oluşturduktan sonra TestClass içerisinden bunu test edelim.

WeldingRobot weldingRobot = new WeldingRobot();
weldingRobot.assemble();
Çıktı:
AssemblyRobot.assemble()

Görüldüğü gibi hem çıktı hem de method bir üst sınıftan gelmektedir. Bu durumla daha evvel karşılaşmıştık. Şimdi gelin üst sınıftaki assemble() methodunun bir kopyasını WeldingRobot sınıfımızın içerisine kodlayalım ve ardından testimizi yeniden çalıştıralım.

public class WeldingRobot extends AssemblyRobot {
	
	@Override
	public void assemble() {
		super.assemble();
		System.out.println("WeldingRobot.assemble()");
	}	
}
Çıktı:
AssemblyRobot.assemble()
WeldingRobot.assemble()

Bu durumda iki sınıf birden çıktı veriyor gibi gözükmektedir. Ancak üst sınıfın çıktı vermesinin sebebi super.assemble(); ifadesidir. Bu satırı silerseniz WeldingRobot kendi başına çalışacaktır. Tersi şekilde sadece AssemblyRobot sınıfına ait bir nesne ile main methodumuzu çalıştırdığımızda görürüz ki alt sınıfın kodları çalışmaz. Beklenen de bu şekilde olmasıdır. WeldingRobot sınıfının içerisinde AssemblyRobot sınıfına ait bir methodu yeniden doldurarak o methodu override etmiş olduk. Hatta kod içerisinde bunu @Override annotasyonu ile de işaretledik. Bu annotasyonu silseniz de kodumuz çalışırdı. Ancak bir alışkanlık olarak bu annotasyonu kullanmanızı öneririm.

Bu yazımızda methodlarımızı nasıl overload edeceğimizi ve override edeceğimizi gördük. Bir sonraki yazıda görüşmek üzere.

1 comment on Overload ve Override

Leave a Reply

Your email address will not be published. Required fields are marked *