在設計我的軟件時,我開始使用接口,因爲這似乎是「標準」。然後我轉向抽象類,因爲它們似乎更適合手頭的問題。但是我不確定在做這個設計選擇時是否遺漏了一些考慮因素。除了特定於領域的問題,我已經考慮過在接口和摘要類之間進行選擇時需要考慮的更一般因素是什麼?在界面和抽象類之間進行選擇時需要考慮的因素是什麼?
1
A
回答
2
我發現大部分時間都是最好的選擇。當你依賴基類中發生的事情時,這並不總是可行的。 只要你不需要接口的實現者發生什麼事情,提供一個抽象基類和一個接口就可以讓你的抽象實現者擁有最大的自由度。如果您需要說有事,那麼你不要在所有提供的接口 - 你還需要確保你的基類來確保這一點需要總是發生作用......
對兩者都有負面影響:更多咕。
例如僞代碼:
interface IVehicle
{
void PutCarInGear(Int speed);
}
abstract class Vehicle : IVehicle
{
public void PutCarInGear(Int speed)
{
//base implementation
}
}
注意,在這個例子中,有人可能會提出自己的類,它實現IVehicle
,然後把它傳遞給任何需要的IVehicle
。這個對象不需要是抽象類的兒童。因此,如果你期望在方法中發生特定的事情,那麼這個新班級很可能不會滿足這個期望。但是,只要它不受IVehicle
的什麼實現影響,那麼它就是具有抽象基類和接口的最靈活的抽象。
2
繼承定義了組合的相似性。接口定義行爲的相似性。從那裏你必須決定組合是否足夠重要以覆蓋行爲。
0
如果您的界面對於至少某些功能還具有合理的默認行爲,您可能需要使用抽象類來避免所有具體實現中的通用樣板代碼。否則,使用一個接口。
0
當您有多個實例來模板化模板方法時,使用抽象類。
假設你有三個解析器。一個通過「,」,另一個通過「」,另一個通過「|」來刪除文件的數據
然後,您可以有一個CommaParser,一個SpaceParser和PipeParser,所有子類的抽象語法分析器,並重寫抽象方法,getDelimiter()
時使用的類不共享實現一個接口,而只是響應相同的方法調用。
0
如果它是「是」的關係並且應該做子集/所有功能,則將其保留爲抽象類。如果它是「應該做的」關係,則將其保持爲界面。
相關問題
- 1. 選擇NoSQL解決方案時需要考慮的重要因素是什麼?
- 2. 在開發書籤時需要考慮什麼樣的設計和安全考慮因素?
- 3. 進行用戶控制之前需要考慮的重要事項是什麼?
- 4. 在爲30 TB數據選擇Graph DB時需要考慮哪些因素
- 5. 選擇界面或抽象類
- 6. 如果我們需要在cassandra和bigcouch之間進行選擇,我們應該考慮哪個標準?
- 7. PHP執行時間:決定執行速度時要考慮的因素
- 8. ConstructorInfo.Invoke的DynamicMethod,我需要考慮什麼?
- 9. 爲什麼你需要知道抽象類的抽象方法是否抽象
- 10. Actionscript 3:界面和抽象之間有什麼區別,何時使用它們..?
- 11. 在從表中刪除列之前要考慮的因素
- 12. 長時間運行的PHP腳本的內存考慮因素
- 13. 爲什麼需要抽象類?
- 14. Enterprise Architect&UML:選擇界面或抽象類時的微妙之處
- 15. 界面/抽象類
- 16. 使用Amazon SimpleDB的性能考慮因素是什麼?
- 17. 在選擇服務器語言時,我必須考慮除開發時間之外的其他因素嗎?
- 18. 選擇SQL/NoSQL應該考慮什麼?
- 19. 我應該考慮什麼因素來選擇任何MVC框架
- 20. 長時間運行RTS遊戲多人遊戲考慮因素
- 21. 您在設計tinyurl網站時需要考慮什麼?
- 22. 要考慮點擊什麼?
- 23. 爲什麼我們需要抽象類而不是虛擬類?
- 24. 什麼在Java中需要抽象類和接口
- 25. 宏是什麼類型的考慮?
- 26. 桌面應用程序對象的設計考慮因素
- 27. 界面和抽象類有什麼區別?
- 28. 是否需要考慮在x64和x86上運行.net程序?
- 29. 選擇合適的jQuery AJAX超時長度時應考慮哪些因素?
- 30. C#火和忘記考慮因素
重複多次:http://stackoverflow.com/questions/376642/inheritance-design-using-interface-abstract-class-good-practice和其他 – cletus 2010-01-25 04:14:12