2012-04-17 52 views
0

我有3個班。他們有所有類似的整數,方法等...邏輯矛盾在課堂設計中背叛了OOP嗎?

class Country{ 

     int a,b; 
public: 
     Country(); 
     void doSomething(); 
     : 
     : 
} 

class Military : public Country { 
public: 
     Power(); 
     void doAnother(); 
     void doAnother2(); 
     : 
     : 
} 

class Technology : public Military{ 
public: 
     Technology(); 
     void doAnother3(); 
     : 
     : 
} 

假設這種繼承適合我的解決方案。但正如你所看到的,當我從國家創建軍事時,邏輯上它們之間沒有關係。我的意思是,軍隊不是一個國家。同樣來自國家的技術,問題也是一樣的。技術不是軍事也不是國家。

無論如何,這個解決方案對我來說是好的,它縮短了我的代碼,但是如果我這樣做,我會背叛面向對象的編程理念嗎?這是否是一個矛盾?

+0

歡迎來到Stack Overflow!對於你的具體'doSomething'('tax()'?'signTreaty()'?),說'Technology tech; tech.doSomething()'?如果不是,那麼這個繼承不適合你的解決方案。 – 2012-04-17 15:02:52

+1

FWIW,看起來你正在嘗試用'Power'構建一個'Military'。雖然這在哲學上可能是真實的,但它不是C++的價值。 – 2012-04-17 15:04:23

+0

是的......甚至沒有'typedef軍事實力;'將在C++視圖中修復這個問題。 – Potatoswatter 2012-04-17 15:06:04

回答

4

是的,這是反對OOP。您的關係是has-a,而不是is-a

您應該爲此使用組合而不是繼承。

class Country{ 
     Military m; //Country has-a military 
     int a,b; 
public: 
     Country(); 
     void doSomething(); 
} 

class Military{ 
     Technology t; //Military has-a technology 
public: 
     Military(); 
     void doAnother(); 
     void doAnother2(); 
} 

class Technology{ 
public: 
     Technology(); 
     void doAnother3(); 
} 
9

所有這些繼承關係都是錯誤的。一個國家「擁有」軍事和軍事「擁有」技術。因此他們應該是成員。繼承是「是一種」關係。

如果您顛覆了語言結構的預期含義,您可能會在稍後付錢。

1

這是錯誤的設計
當你繼承某個類時,它的is-a關係。並且繼承不是code reuse

您可以爲它們常見的行爲建立has-a關係。

如鍵盤有按鈕,我的襯衫也有。但我的襯衫is not a鍵盤。
所以它應該設計爲shirt has buttonskeyboards has buttons