2010-01-25 53 views
1

在設計我的軟件時,我開始使用接口,因爲這似乎是「標準」。然後我轉向抽象類,因爲它們似乎更適合手頭的問題。但是我不確定在做這個設計選擇時是否遺漏了一些考慮因素。除了特定於領域的問題,我已經考慮過在接口和摘要類之間進行選擇時需要考慮的更一般因素是什麼?在界面和抽象類之間進行選擇時需要考慮的因素是什麼?

+0

重複多次:http://stackoverflow.com/questions/376642/inheritance-design-using-interface-abstract-class-good-practice和其他 – cletus 2010-01-25 04:14:12

回答

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

如果它是「是」的關係並且應該做子集/所有功能,則將其保留爲抽象類。如果它是「應該做的」關係,則將其保持爲界面。

相關問題