- 基類實現接口的缺點/風險是什麼?
- 總是在子類上實現接口會更好嗎?
您什麼時候使用其中一種?基類實現接口
public interface IFriendly { string GetFriendly(); } public abstract class Person: IFriendly { public abstract string GetFriendly(); }
VS.
public interface IFriendly { string GetFriendly(); } public abstract class Person { // some other stuff i would like subclasses to have } public abstract class Employee : Person, IFriendly { public string GetFriendly() { return "friendly"; } }
Q
基類實現接口
3
A
回答
5
那麼,你需要考慮這樣的說法:
public interface IBreathing
{
void Breathe();
}
//because every human breathe
public abstract class Human : IBreathing
{
abstract void Breathe();
}
public interface IVillain
{
void FightHumanity();
}
public interface IHero
{
void SaveHumanity();
}
//not every human is a villain
public class HumanVillain : Human, IVillain
{
void Breathe() {}
void FightHumanity() {}
}
//but not every is a hero either
public class HumanHero : Human, IHero
{
void Breathe() {}
void SaveHumanity() {}
}
的一點是,你的基類應該實現接口(或繼承,但只公開了其作爲抽象定義)只如果從它派生出來的其他類也應該實現該接口。 因此,通過上面提供的基本示例,只有在每個呼吸爲Human
(這裏是正確的)時,纔會使Human
執行IBreathing
。
但是!您無法使Human
同時執行IVillain
和IHero
,因爲這會使我們無法在以後分辨出是否是另一個。其實,這樣的實施意味着每一個Human
既是一個惡棍又是一個英雄。
爲了結束回答你的問題:
什麼是實現一個接口的基類的缺點/風險?
沒有,如果從它派生的每個類都應該實現該接口。
總是在子類上實現接口是否更好?
如果每一個類從基地之一也應實現該接口派生,它是相當一個必須
當你使用一個或其他?
如果從第一個派生的每個類都應該實現這樣的接口,那麼讓基類繼承它。如果不是,則創建具體的類實現這樣的接口。
2
從基類開始,將您與基類的實現聯繫起來。我們總是開始考慮基類正是我們想要的。然後我們需要一個新的繼承類,它不太適合,所以我們發現自己回去修改基類以適應繼承類的需求。它總是發生。
如果你從一個界面開始,那麼你有更多的靈活性。無需修改基類,只需編寫一個實現接口的新類即可。當它可以工作時,你可以獲得類繼承的好處,但是當它不起作用時,它不會被綁定到它。
當我第一次使用OOP時,我喜歡類繼承。令人驚訝的是,實際上它很少有結果。這就是Composition Over Inheritance的負責人進來的地方。最好從類的組合中構建功能,而不是將它嵌套在繼承的類中。
還有Open/Closed原理。如果你可以繼承,很好,但是你不想回頭去改變基類(並且冒險破壞其他東西),因爲新的繼承類需要正確的工作。編程到接口而不是基類可以保護您不必修改現有的基類。
相關問題
- 1. 將接口實現拉入基類
- 2. 實現接口的通用基類
- 3. 類設計:類實現接口實現另一個接口
- 4. 子類實現Runnable接口
- 5. 抽象類實現接口
- 6. 接口類實現Runnable
- 7. 實現接口Singleton類
- 8. 匿名類實現接口
- 9. 接口實現時不透露實現接口的類
- 10. 繼承類是否自動從其基類實現接口?
- 11. Java接口:調用一個實現類基於對象類型
- 12. 如何訪問實現接口並具有基類的類?
- 13. 實現派生類接口方法的抽象基類
- 14. 傑克遜:基於實現的接口
- 15. 實現一個基本接口問題
- 16. 實現派生接口的基礎件
- 17. 實現接口到一個類:接口到接口
- 18. 實現接口
- 19. 實現接口
- 20. 實現接口
- 21. 實現接口
- 22. 接口實現
- 23. 將接口實例分配給實現該接口的類
- 24. 實施接口錯誤:類不實現接口成員
- 25. 創建實現兩個通用接口的通用基類?
- 26. C++:如何在基類的父接口中實現函數?
- 27. 基於同一接口實現的類型之間的轉換
- 28. 可以擴展一個基類和實現接口
- 29. C++:派生+基類實現單一接口?
- 30. 什麼接口可以實現基本類型
***全部***派生類將使用此實現在基類中實現;否則留下抽象。 –