Java membuat perbedaan yang jelas antara classdan interface. (Saya percaya C # juga, tapi saya tidak punya pengalaman dengannya). Namun ketika menulis C ++ tidak ada perbedaan yang dipaksakan bahasa antara kelas dan antarmuka.
Akibatnya saya selalu melihat antarmuka sebagai solusi untuk kurangnya pewarisan berganda di Jawa. Membuat perbedaan seperti itu terasa sewenang-wenang dan tidak berarti dalam C ++.
Saya selalu cenderung pergi dengan pendekatan "menulis hal-hal dengan cara yang paling jelas", jadi jika dalam C ++ saya punya apa yang disebut antarmuka di Jawa, misalnya:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() = 0;
};
dan saya kemudian memutuskan bahwa sebagian besar pelaksana Fooingin berbagi beberapa fungsi umum yang mungkin akan saya tulis:
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);
};
Yang kemudian membuat ini bukan antarmuka dalam arti Java lagi.
Sebaliknya C ++ memiliki dua konsep penting, terkait dengan masalah warisan yang mendasari yang sama:
virtualwarisanKelas tanpa variabel anggota tidak dapat menempati ruang tambahan saat digunakan sebagai basis
"Subobjek kelas dasar mungkin memiliki ukuran nol"
Di antara yang saya coba hindari # 1 sedapat mungkin - jarang terjadi skenario di mana yang benar-benar merupakan desain "terbersih". Namun # 2 adalah perbedaan yang halus, tetapi penting antara pemahaman saya tentang istilah "antarmuka" dan fitur bahasa C ++. Sebagai hasil dari ini saya saat ini (hampir) tidak pernah menyebut hal-hal sebagai "antarmuka" di C ++ dan berbicara dalam hal kelas dasar dan ukurannya. Saya akan mengatakan bahwa dalam konteks C ++ "antarmuka" adalah nama yang salah.
Namun telah menjadi perhatian saya bahwa tidak banyak orang membuat perbedaan seperti itu.
- Apakah saya akan kehilangan apa pun dengan membiarkan (mis.
protected)virtualFungsi tidak ada dalam "antarmuka" di C ++? (Perasaan saya justru sebaliknya - lokasi yang lebih alami untuk kode bersama) - Apakah istilah "antarmuka" bermakna dalam C ++ - apakah itu menyiratkan hanya murni
virtualatau apakah adil untuk memanggil kelas C ++ tanpa variabel anggota antarmuka masih?
~Foo() {}dalam kelas abstrak adalah kesalahan di bawah (hampir) setiap keadaan.
internalHelperThingdapat disimulasikan dalam hampir semua kasus.