Arayüzleri 'keşfettim' ve onları sevmeye başladım. Bir arayüzün güzelliği, bir sözleşme olması ve bu sözleşmeyi yerine getiren herhangi bir nesne, arayüzün gerekli olduğu her yerde kullanılabilir.
Bir arabirimdeki sorun, sıradan özellikler için bir acı olan ve DRY'yi yenen varsayılan bir uygulamaya sahip olamamasıdır. Bu da iyidir, çünkü uygulamayı ve sistemi birbirinden ayırır. Elde kalıtım, daha sıkı bir bağlantı sağlar ve kapsülleme kırılma potansiyeline sahiptir.
Durum 1 (Özel üyelerle miras, iyi kapsülleme, sıkıca bağlı)
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();
)
Durum 2 (sadece bir arayüz)
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.
Durum 3: (her iki dünyanın en iyisi?)
Durum 1'e benzer . Ancak, (varsayımsal olarak) C ++ 'ın saf sanal olan yöntemler dışında geçersiz kılma yöntemlerine izin vermediğini düşünün .
Bu nedenle, Durum 1'de , do_work () geçersiz kılmak derleme zamanı hatasına neden olur. Bunu düzeltmek için do_work () öğesini saf sanal olarak ayarladık ve increment_money_earned () için ayrı bir yöntem ekledik. Örnek olarak:
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(); ); .
};
Ama bunun bile sorunları var. Ya 3 ay sonra, Joe Coder bir Doktor Çalışanı oluşturur, ancak do_work () 'de increment_money_earned ()' i çağırmayı unutursa?
Soru:
Vaka 3 , Vaka 1'den daha üstün mü ? Bunun nedeni 'daha iyi kapsülleme' veya 'daha gevşek bir şekilde bağlanmış' ya da başka bir sebep mi?
Case 3 , DRY ile uyumlu olduğu için Case 2'den daha üstün mü ?