Interface ve Abstract'ların farklılıkları nelerdir?

Hiç bilginiz yoksa fikir sahibi olmanız için çok kısa bilgi vereceğim;

Abstract class deyince aklına alt sınıfların genel özelliklerini tutan bir sınıf gelmeli, interface ise onu implemente eden sınıfların yapabileceklerini tutan bir şablon gibi düşünmelisin. Abstract class "is a", interface "has a" şeklinde düşünülür.

abstract class->canlı varlıklar ise, insan bunu extend eder, kedi extend eder, kuş extend eder vb. insan da kedi de kuş da birer canlıdır. (insan "is a" canlı) abstract sınıfta mesela integer tipinde canlının yaşı bilgisini tutabilirsiniz, tüm canlıların yaşı vardır gibi düşünün, getYaş, setYaş methodlarını abstract sınıfa eklersiniz.

interface-> konuşabilir, yürüyebilir, uçabilir vb. interfaceler tanımlayabilirsiniz. insan konuşabilir, yürüyebilir interfacelerini implemente eder. kedi ve kuş konuşabilir interfaceini implemente edemez. konuşabilir interfacei içine konus() gibi bir method bulunur, insan sınıfı böylece konuşabilir. (insan "has a" konuşma yeteneği)

Mimari oluştururken hangisini kullanacağınız sizin tasarımınıza kalmış, bu basit örneği isterseniz sadece interface ile ya da sadece abstract classlar ile de yapabilirsiniz. (mesela canlı varlıklar abstract classı yerine canlı varlık interface i oluşturup da getYaş, setYaş şeklinde methodları bu interfacei implemente eden sınıflara bu methodları kullanma sorumluluğunu atabilirsiniz) Aslında uygulanması gereken yukarda bahsettiğim "is a" "has a" mantığını kullanmaktır.

Soru oldukça genel, internette bu soruların cevabını pek çok yerde text, görsel, video gibi formatlarda istenen düzeyde bulabileceğinizi düşünüyorum, kolay gelsin.
 
Farklılık gibi bir ifade kullanamayız. Birisi sınıftır birisi interface’dir. Farklı şeyler yani.
Abstract class tam class değildir sanki interface ile ara geçiş formu gibi. Abstract'lar new'lenemezler tıpkı interface'ler gibi. Normal class'lar new'lenebilirler. Abstract'ın kullanılabilinmesi için concrete bir class tarafından inherit edilmesi gerekir. Abstract bir class'ın yapıcı metodu olabilir ancak dışarıdan çağırılamayacağı için protected erişim belirteci ile kullanılmalıdır çünkü sadece inherit eden kullanabiliyor. Public olursa anlamsız olur. 🙂
 
Son düzenleme:
Cok genis olcekli soru sormussun, bunu kisaca cevaplamak pek mumkun degil.

Abstract ne oldugun, interface "neler" yaptigin gibi ozetlenebilir.

USB bir interface'dir, 2 ucunda ne oldugunu bilemezsin ama protokolu bellidir. Web kamerasi da olur, cig kofte makinesi de. USB interface'inin protokolunu degistirirsen tum USB cihazlarin iletisimi bozulur.

Silikon ozunde ne oldugundur, kendini bir islemcinin merkezinde de bulabilirsin bir implantin sarkan bolumunde de :)

Silikonun madde olarak ozelliklerini degistirirsen bozulan sey islemci ve yari iletken chiplerle kalmaz.

Bu 2 ornek ile anlatmaya calistigim sey, "abstract" ya da super-class ile daha derin bir kontrolunun fakat daha fazla baglilik yarattigin. Bu sebeple sagda solda surekli abstract yerine interface tercih etmelisin denir. SOLID'de de boyle gecer. Hakim oldugunda neyi nerede kullanacagini bilirsin zaten.

Bu kavramlar OO paradigmasi dahilinde daha anlamli, functional ya da reactive programlama yapacaksan interface, is-a has-a vs diye bu kadar kastirmazsin. Type def yapip high level function ile takilirsin.
 

Technopat Haberler

Geri
Yukarı