Abstract class’lar ve interfaceler kullanim olarak birbirlerine benzedikleri icin bu soru çoğu kisinin kafasini karistiran bir soru. Ayni işi yapan iki farkli yapı var gibi görünmesinin en büyük sebebi ise Java’da bir sınıfın sadece ve sadece tek bir superclassi olabilmesi. C++’daki gibi birden fazla sınıftan (extend kelimesi ile) inherit edemiyoruz. aradaki farklari olabildigince acıklayarak ozetlemeye calisacağım.
Abstract sınıflar ve interfaceler arasindaki en buyuk farklilik kullanim amaçları diyebiliriz. Abstract sınıfın amacı, kendisinden bir nesne yaratılmayacak, ama hiyerarşide başka sınıfların superclassi olarak kullanilabilecek bir yapi saglamaktir. Ornegin basit bir oyun yazdigimizi düşünün, farklı farklı uzayli yaratıklar olacak (Marslı sınıfı, Venüslü sınıfı vb.). Bunların extend edeceği, ortak özelliklerini bir araya getiren Uzaylı diye bir sınıf yapmak isteyebiliriz. Ama doğrudan Uzaylı sınıfından bir nesne hiç kullanilmayacak (yani oyundaki her uzayli ya marsli, ya venuslu, ya da diger alt sınıftan birinden olmalı).Işte bu durumda uygun olan Uzayli classinin abstract class olması.
Interface’in amacı ise belirli bir işlev gerçekleştirecek olan tum sınıfların ayni metod tanimlarini içermesini sağlamak diyebiliriz. Ya da şöyle düşünün, bir nesnenin methodlari o nesnenin dışarıyla (diğer nesnelerle) nasıl etkileşeceğini belirleyen bir arayuz gibidir. bunu cep telefonunun tuslarina benzetebiliriz – dokunmatik olmadigini varsayalim 🙂 Iste bir interface tanimi kendisini implement eden sınıfın hangi metodlari mutlaka bulundurmasi gerektiğini belirlemek için kullanilir (her cep telefonunda 0-9 sayi tuşlari ve arama tuşu olmak
zorunda demek gibi).
Ikisinin sıklıkla karıştırılmasının en buyuk sebebi örneklerin birbirine hep benzemesidir, abstract sınıf için kullandığım Uzaylı örneğinde interface olarak da tanimlanabilir. Interface’lerde de abstract sınıflar da yine bir A sınıfı bir B’dir anlami var. Burada B interface de olabilir abstract sınıf da. Kullanim olarak en büyük farklılıkları ise şu: abstract sınıf B’den inherit eden (public class A extends B) bir A sinifi, normal sınıflardan inherit ettiğinde de oldugu gibi başka classlardan inherit edemez. Diger bir deyisle bir classin doğrudan extend ettigi sadece bir superclassi olabilir. Diger taraftan bir class bircok interface’i implement edebilir.
Program yazarken belirli birseyi abstract class mi yapayim yoksa interface mi sorusu siklikla akla gelir. Bunun net bir cevabi yok. Ilk dusunmemiz gereken, belki de en büyük belirleyici, “yazmak istediğim tanimlari içerecek olan classlar baska yerlerden (interface veya abstract classlardan) ozellikler de alabilecek mi?” sorusu olmali. Çünkü bir kez daha söylüyorum, bir classin extend ettigi sadece bir abstract class olabilir ama bircok interface implement edebilir. Dolayısiyla eğer soruya yanıt evet ise yazacağimiz şeyleri interface olarak yazmayı dusunmeliyiz. Baktığımız diğer kaynaklarda bunun dışında başka tavsiyeler de görebiliriz. Ama bu bir tasarimkararı ve matematiksel olarak kesin bir yanıtı yok.
Daha fazla bilgi için aşağıdaki linklere göz atabilirsiniz.
http://www.javabeginner.com/learn-java/java-abstract-class-and-interface
http://www.javaworld.com/javaworld/javaqa/2001-04/03-qa-0420-abstract.html
http://java.sun.com/docs/books/tutorial/java/concepts/index.html
http://mindprod.com/jgloss/interfacevsabstract.html
Yardımından dolayı hocam Kurtuluş Küllüye teşekkür ediyorum.
Ferid Mövsümov
08.07.2010
Okuduğum yazılar arasında nispeten açık bir yorum getiren bir yazı olmuş. Beğendim. Teşekkürler.
Abstract Class ve interfaceler hakkında onlarca makale okudum.bu kadar net bir şekilde açıklama yapan bir tek sizin makalenizdi
Teşekkür ederim