如果「超類型」,和你比較的接口,我猜你要專注於抽象基類。 (雖然你可以使用非抽象的基類,但是通常甚至一個抽象類沒有抽象成員往往會向開發者傳達它的意圖是被實現/繼承,並且不能作爲一個類型自己站立)
當涉及到基類/抽象類與接口時,沒有總體的「最佳實踐」。他們都在設計實踐中佔有一席之地。真的,最好的實踐來自您正在實施的設計。
當涉及到您的設計考慮因素時,最大的區別可能是base/abstract類只能繼承,而接口可以在任何類別上實現。
(編輯:pilotcam想出了一個更好的例子,看他的問題評論) 從你的鳥例子,比方說你要處理不同的鳥類如鸚鵡,信天翁和企鵝,他們都繼承自Bird
。但是然後你的應用程序也處理Dinosaur
類型。你開始實施Archaeopteryx。它是從Dinosaur
還是從Bird
繼承?現在,如果Bird
是一個界面,您可以簡單地使用class Archaeopteryx : Dinsoaur, IBird
。這個例子有點做作(我確定有一個更好的),但希望它足夠好。
當然,基類/抽象類也很好。例如,通過組合訪問修飾符,您可以利用可能實現API訪問實現的方法,但類的外部用戶不能。
真的有一個理由使用一個在另一個,並沒有一個是真的「更好」來編碼。這真的取決於你的應用程序設計,可以說是你編碼的隱喻;這些對象代表什麼。你的對象實際上是一隻鳥,還是隻有表現爲就像一隻鳥?你的API是否關心?什麼會更好地維護你的工作?
這裏的一些閱讀: Interface vs Abstract Class (general OO)(注意所有的「鏈接」類似的問題這一個)
取決於您的設計。通常情況下,如果要實現某些共享功能或某些必需的日誌記錄(例如),則需要使用基本抽象類。當您沒有實現特定功能或其他域數據傳輸使用時,接口非常有用。如果你谷歌的「抽象類與接口」,你會發現一堆的討論和信息。 http://www.google.com/search?q=abstract%20class%20vs%20interface編輯:此外,一些模式/語言功能僅適用於抽象和其他接口;所以通常設計驅動使用。 – 2012-07-17 01:16:50
我同意@Chris。總的來說,在現實世界中更爲明顯。例如,通過建議接口爲IBirdseedEater,類Squirrel可以實現所述接口並相應地運行。 – pilotcam 2012-07-17 01:31:14
答案是:是的。 – user7116 2012-07-17 01:37:07