Java, class
ve arasında net bir ayrım yapar interface
. (C # da inanıyorum, ama onunla hiçbir deneyimim yok). Ancak C ++ yazarken, sınıf ve arabirim arasında dil tarafından zorlanan bir ayrım yoktur.
Sonuç olarak ben her zaman Java çoklu kalıtım eksikliği için bir çözüm olarak gördüm. Böyle bir ayrım yapmak C ++ 'da keyfi ve anlamsızdır.
Ben her zaman "en belirgin şekilde şeyler yazmak" yaklaşımı ile gitmek eğiliminde, bu yüzden C ++ Java, örneğin bir arayüz denir ne var?
class Foo {
public:
virtual void doStuff() = 0;
~Foo() = 0;
};
ve sonra uygulayıcılarının çoğunun Foo
muhtemelen yazacağım bazı ortak işlevleri paylaşmak istediğine karar verdim :
class Foo {
public:
virtual void doStuff() = 0;
~Foo() {}
protected:
// If it needs this to do its thing:
int internalHelperThing(int);
// Or if it doesn't need the this pointer:
static int someOtherHelper(int);
};
Bu da artık Java anlamında bir arayüz değil.
Bunun yerine C ++ 'nin aynı temel miras problemiyle ilgili iki önemli konsepti vardır:
virtual
inhertianceÜye değişkeni olmayan sınıflar, temel olarak kullanıldığında fazladan yer kaplayamaz
"Temel sınıf alt nesnelerinin boyutu sıfır olabilir"
Mümkün olan her yerde # 1'den kaçınmaya çalıştım - bunun gerçekten "en temiz" tasarım olduğu bir senaryo ile karşılaşmak nadirdir. Ancak # 2, "arayüz" terimini anlamam ile C ++ dil özellikleri arasındaki ince fakat önemli bir farktır. Bunun bir sonucu olarak, şu anda (neredeyse) hiçbir zaman C ++ 'da "arabirimler" olarak bahsetmiyorum ve temel sınıflar ve boyutları açısından konuşuyorum. C ++ "arayüz" bağlamında bir yanlış ad olduğunu söyleyebilirim.
Ancak pek çok insanın böyle bir ayrım yapmadığı dikkatimi çekti.
- C ++ 'ta bir "arayüz" içinde (örn.
protected
) Olmayanvirtual
fonksiyonların var olmasına izin vererek bir şey kaybetmek için stand ? (Hislerim tam tersi - paylaşılan kod için daha doğal bir yer) - "Arayüz" terimi C ++ için anlamlı mı - sadece saf
virtual
mı yoksa üye değişkenleri olmayan C ++ sınıflarını hala bir arayüz olarak çağırmak adil olur mu?
~Foo() {}
soyut bir sınıftaki bir halk (neredeyse) her koşul altında bir hatadır.
internalHelperThing
hemen hemen tüm durumlarda simüle edilebilir.