Saya 'menemukan' antarmuka dan saya mulai menyukainya. Keindahan antarmuka adalah bahwa itu adalah kontrak, dan objek apa pun yang memenuhi kontrak itu dapat digunakan di mana pun antarmuka itu diperlukan.
Masalah dengan antarmuka adalah bahwa itu tidak dapat memiliki implementasi standar, yang merupakan rasa sakit untuk properti biasa dan mengalahkan KERING. Ini juga bagus, karena menjaga implementasi dan sistem dipisahkan. Warisan, di tangan, mempertahankan kopling yang lebih ketat, dan memiliki potensi melanggar enkapsulasi.
Kasus 1 (Warisan dengan anggota pribadi, enkapsulasi yang baik, sangat erat)
class Employee
{
int money_earned;
string name;
public:
void do_work(){money_earned++;};
string get_name(return name;);
};
class Nurse : public Employee:
{
public:
void do_work(/*do work. Oops, can't update money_earned. Unaware I have to call superclass' do_work()*/);
};
void HireNurse(Nurse *n)
{
nurse->do_work();
)
Kasus 2 (hanya antarmuka)
class IEmployee
{
virtual void do_work()=0;
virtual string get_name()=0;
};
//class Nurse implements IEmployee.
//But now, for each employee, must repeat the get_name() implementation,
//and add a name member string, which breaks DRY.
Kasus 3: (terbaik dari kedua dunia?)
Mirip dengan Kasus 1 . Namun, bayangkan bahwa (secara hipotetis) C ++ tidak mengizinkan metode utama kecuali metode-metode yang murni virtual .
Jadi, dalam Kasus 1 , mengesampingkan do_work () akan menyebabkan kesalahan waktu kompilasi. Untuk memperbaiki ini, kami menetapkan do_work () sebagai virtual murni, dan menambahkan metode terpisah increment_money_earned (). Sebagai contoh:
class Employee
{
int money_earned;
string name;
public:
virtual void do_work()=0;
void increment_money_earned(money_earned++;);
string get_name(return name;);
};
class Nurse : public Employee:
{
public:
void do_work(/*do work*/ increment_money_earned(); ); .
};
Tetapi bahkan ini memiliki masalah. Bagaimana jika 3 bulan dari sekarang, Joe Coder menciptakan Karyawan Dokter, tetapi ia lupa menelepon increment_money_earned () di do_work ()?
Pertanyaan:
Apakah Case 3 lebih unggul dari Case 1 ? Apakah karena 'enkapsulasi yang lebih baik' atau 'lebih longgar digabungkan', atau karena alasan lain?
Apakah Case 3 lebih unggul dari Case 2 karena sesuai dengan KERING?