Çoklu kalıtıma izin veren ve arayüzleri olmayan C ++ gibi bir dilde, tüm yöntemlerin soyut olduğu soyut sınıflar arayüzler olarak kullanılabilir. C ++ ile o kadar çok çalışmadım, ancak temel sınıflarda aynı ada sahip yöntemler olduğunda çoklu miras sorunlara neden olabilir sanırım.
PHP ve C # gibi dillerde, arayüzler benzer bir polimorfizme ulaşmanın bir yolunu sağlar, ancak soyut bir sınıfı devralmak ve bir arabirim uygulamak arasında kavramsal bir fark olduğu için buna "kalıtım" demekten hoşlanmam. Arabirimler çatışma sorununu ortadan kaldırır, çünkü kendileri uygulama sağlamazlar.
Bir arabirim dış dünya için bir sözleşme görevi görürken, soyut bir sınıf bir uygulama sağlayabilir, ancak bir arabirimi "taklit etmek" için kullanılırsa, büyük olasılıkla olmayacaktır.
Temel kavramsal fark, bir sınıf başka bir sınıfı miras aldığında (soyut ya da değil), "bir" ilişkisi vardır, yani a Car
bir Vehicle
ve Dog
bir 'dir Animal
. Bir arayüzle, nesnenin önemli yaptığı şey budur. Her iki yüzden Car
ve Dog
can Move()
ve uygulayabilir çünkü tüketici bunu biliyor Movable
, ama bir araba kesinlikle değil Dog
veya bir Animal
. Ve hareket uygulaması farklı olacak (tekerlekler bacaklara karşı), ancak tüketim kodu umursamıyor ve olmamalıdır. Arayüzler uygulamadan ziyade tüketen kodla ilgilidir.
Ana nokta, seçtiğiniz dilde arayüzleriniz varsa, bunları orada oldukları şeyler için kullanın. Değilse (C ++ gibi), onları saf soyut sınıfları kullanarak taklit edebilirsiniz.