Java membuat perbedaan yang jelas antara class
dan 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 Foo
ingin 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:
virtual
warisanKelas 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
)virtual
Fungsi 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
virtual
atau apakah adil untuk memanggil kelas C ++ tanpa variabel anggota antarmuka masih?
~Foo() {}
dalam kelas abstrak adalah kesalahan di bawah (hampir) setiap keadaan.
internalHelperThing
dapat disimulasikan dalam hampir semua kasus.