2012-07-17 23 views
0

什麼被認爲是一般的最佳實踐:對SuperType或Interface進行編碼會更好嗎?

通過超類型引用?

public class BirdFeeder{ 

    public Feed(Bird bird){...} 

} 

或通過接口

public class BirdFeeder{ 

    public Feed(IBird iBird){...} 

} 

我個人更喜歡接口,但我不太知道爲什麼,對我來說,他們只是覺得「清潔」。我想更好地理解爲什麼我會選擇一個。

感謝

+0

取決於您的設計。通常情況下,如果要實現某些共享功能或某些必需的日誌記錄(例如),則需要使用基本抽象類。當您沒有實現特定功能或其他域數據傳輸使用時,接口非常有用。如果你谷歌的「抽象類與接口」,你會發現一堆的討論和信息。 http://www.google.com/search?q=abstract%20class%20vs%20interface編輯:此外,一些模式/語言功能僅適用於抽象和其他接口;所以通常設計驅動使用。 – 2012-07-17 01:16:50

+0

我同意@Chris。總的來說,在現實世界中更爲明顯。例如,通過建議接口爲IBirdseedEater,類Squirrel可以實現所述接口並相應地運行。 – pilotcam 2012-07-17 01:31:14

+1

答案是:是的。 – user7116 2012-07-17 01:37:07

回答

2

一下你對這個接口是正確的,他們爲您提供設計你的繼承層次更多的靈活性。

假設您有一個以基類Bird開頭的層次結構,並繼續到各種鳥類。現在假設你想添加一隻機械鳥給鳥類,但是你更願意從基類中派生出它。如果你的餵食器需要Bird的論點,你的機械鳥需要一個特殊的餵食器。但是,如果饋線採用IBird,只要正確實施IBird接口,向它發送RoboBird就不會有問題。

1

如果「超類型」,和你比較的接口,我猜你要專注於抽象基類。 (雖然你可以使用非抽象的基類,但是通常甚至一個抽象類沒有抽象成員往往會向開發者傳達它的意圖是被實現/繼承,並且不能作爲一個類型自己站立)

當涉及到基類/抽象類與接口時,沒有總體的「最佳實踐」。他們都在設計實踐中佔有一席之地。真的,最好的實踐來自您正在實施的設計。

當涉及到您的設計考慮因素時,最大的區別可能是base/abstract類只能繼承,而接口可以在任何類別上實現。

(編輯:pilotcam想出了一個更好的例子,看他的問題評論) 從你的鳥例子,比方說你要處理不同的鳥類如鸚鵡,信天翁和企鵝,他們都繼承自Bird。但是然後你的應用程序也處理Dinosaur類型。你開始實施Archaeopteryx。它是從Dinosaur還是從Bird繼承?現在,如果Bird是一個界面,您可以簡單地使用class Archaeopteryx : Dinsoaur, IBird。這個例子有點做作(我確定有一個更好的),但希望它足夠好。

當然,基類/抽象類也很好。例如,通過組合訪問修飾符,您可以利用可能實現API訪問實現的方法,但類的外部用戶不能。

真的有一個理由使用一個在另一個,並沒有一個是真的「更好」來編碼。這真的取決於你的應用程序設計,可以說是你編碼的隱喻;這些對象代表什麼。你的對象實際上是一隻鳥,還是隻有表現爲就像一隻鳥?你的API是否關心?什麼會更好地維護你的工作?

這裏的一些閱讀: Interface vs Abstract Class (general OO)(注意所有的「鏈接」類似的問題這一個)

1

當您想要在後代組件中實現一組行爲時使用抽象類。

一個接口,當你想在一些沒有有用的共同祖先的類上實現一組行爲時。

有很多情況,當你可以使用。總的來說,我發現我可以重新設計一個使用接口的設計,獲得新的東西,而不是陷入一系列可怕的妥協。我寧願定義一個接口,然後讓抽象類爲它的後代實現它,而不是沒有接口。這在開始時是一項額外的工作,可以帶來巨大的好處。

相關問題