2009-04-25 63 views
3

抽象類被描述爲可用於一系列對象(例如可用於哺乳動物的動物)。然而,使用接口或抽象類來表示一系列相關對象之間有什麼不同?抽象類與代表族的接口

我的過程是在我想定義常用功能但使用未來擴展選項和自定義功能(實現)接口時使用抽象類。

例如,我編寫了一個抽象類來封裝一些數據庫功能,這些功能將大量用於工作中的小型Web應用程序。我用虛擬方法編寫了一個抽象類,它可以在未來使用自定義功能(例如,日誌記錄或可能需要的某些數據庫事件報告)進行覆蓋。

這是正確的路嗎?選擇一個構造(抽象或界面)來表示一個家庭是否有任何意義?

+0

是否http://stackoverflow.com/questions/56867/interface-vs-base-class回答這個問題?如果是的話。 – Gishu 2009-04-25 15:35:04

+0

可能重複[何時使用接口而不是抽象類,反之亦然?](http://stackoverflow.com/questions/479142/when-to-use-an-interface-instead-of-an-abstract -class-反之亦然) – nawfal 2014-07-07 10:21:54

回答

3

當所有類型之間存在共同的狀態和行爲時,應該使用抽象類。當所有類型都具有通用接口但不共享狀態或行爲時應該使用接口。

這裏是一個例子。

德國牧羊犬,金毛尋回犬,比格犬

這三個對象是所有的狗,因此他們某些共同的狀態(食肉,4個腿等),他們也分享一定的可重複的行爲(樹皮,褲子等)。在這種情況下,最有意義的是創建一個抽象的Dog類來保存這種常見的狀態和行爲,併爲每種類型的狗創建Dog的子類型。

鉛筆,鋼筆,粉筆

這些對象有沒有共同的狀態,它們不能共享行爲。然而你可能會注意到他們有一些共同之處 - 他們是的作者。這些對象最好單獨構建,並且沒有基類,然後將其與Writable接口綁定在一起,從而暴露每種類型的Write方法。

+0

非常符合我的決定。但我認爲它們都適合代表家庭,只要我遵守你提供的指導方針。 – dotnetdev 2009-04-25 15:33:37

0

我會建議使用接口,以便您可以在將來的某個點上在數據庫實用程序中實現新功能。

與往常一樣,主要的設計原則,當談到發展

對接口設計,而不是實現

0

抽象類,你可以提供一個由所有需要和共同實施層次結構中的類。因此,您正在重新使用代碼。您可以允許派生類重寫默認行爲或不重複,但至少您可以爲新生動物提供呼吸等基線功能。但是,使用接口,您不能提供任何實現。您只需定義一個合同,即所有繼承該接口的類都應該遵守並提供實現。這可能會導致類層次結構中重複和重複的代碼。

接口對於可擴展性不是很好,您需要擔心版本控制。您決定對現有界面進行更改,但您很快就會意識到存在許多可能需要修改的類。考慮將呼吸方法添加到已被許多哺乳動物使用的IMammal界面。你需要去爲每個人提供呼吸實施。通過抽象類,您可以簡單地添加Breath方法並提供一些基準實現,而不必擔心現有的派生類。所以抽象類在層次結構和API的開發方面更加靈活。