亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

接口與基類

接口與基類

接口與基類什么時候應該使用接口,什么時候應該使用基類?如果我不想實際定義方法的基本實現,那么它應該始終是一個接口嗎?如果我有狗和貓課。為什么我想要實現IPet而不是PetBase呢?我可以理解ISheds或IBarks的接口(IMakesNoise?),因為它們可以通過寵物放置在寵物上,但我不知道通用寵物使用哪種接口。
查看完整描述

3 回答

?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

讓我們以狗和貓類為例,讓我們用C#來說明:

狗和貓都是動物,特別是四足哺乳動物(動物太普遍了)。讓我們假設你有一個抽象的哺乳動物類,它們都是:

public abstract class Mammal

此基類可能具有默認方法,如:

  • 飼料
  • 配偶

所有這些行為在任何一個物種之間都有或多或少相同的實現。要定義這一點,您將擁有:

public class Dog : Mammalpublic class Cat : Mammal

現在讓我們假設還有其他哺乳動物,我們通常會在動物園看到:

public class Giraffe : Mammalpublic class Rhinoceros : Mammalpublic class Hippopotamus : Mammal

這仍然是有效的,因為在功能的核心Feed()Mate()還是一樣的。

然而,長頸鹿、犀牛和河馬并不完全是你可以用來做寵物的動物。在這里,接口將是有用的:

public interface IPettable{
    IList<Trick> Tricks{get; set;}
    void Bathe();
    void Train(Trick t);}

上述契約的實現在貓和狗之間將是不一樣的;將它們的實現放在一個抽象類中進行繼承將是個壞主意。

您的狗和貓定義現在應該如下所示:

public class Dog : Mammal, IPettablepublic class Cat : Mammal, IPettable

理論上,您可以從更高的基類重寫它們,但從本質上說,接口允許您只將所需的內容添加到類中,而不需要繼承。

因此,因為通常只能從一個抽象類繼承(在大多數靜態類型的OO語言中,即.異常包括C+),但能夠實現多個接口,它允許您嚴格地構造對象視需要基礎。


查看完整回答
反對 回復 2019-06-01
?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

喬希·布洛赫自己說有效Java 2d:

比抽象類更喜歡接口

一些要點:

  • 現有的類可以很容易地進行修改,以實現新的接口。..您所要做的就是添加所需的方法(如果它們還不存在),并向類聲明中添加一個Implements子句。

  • 接口是定義混合器的理想方法。..松散地說,Mixin是一個類除了它的“主類型”之外還可以實現的類型,以聲明它提供了一些可選的行為。例如,可比較是一個混合接口,它允許類聲明其實例是相對于其他相互比較的對象排序的。

  • 接口允許構造無層次的類型框架。..類型層次結構對于組織某些事情是很好的,但是其他的事情并不能整齊地歸入一個僵化的層次結構中。

  • 接口支持安全、強大的功能增強。通過每班包裝成語。如果您使用抽象類來定義類型,那么您將使希望添加功能的程序員別無選擇,只能使用繼承。

此外,您可以結合接口和抽象類的優點,提供一個抽象的框架實現類來與您導出的每個重要接口一起使用。

另一方面,界面很難進化。如果將一個方法添加到一個接口中,它將破壞它的所有實現。

PS:買這本書。這要詳細得多。


查看完整回答
反對 回復 2019-06-01
?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

現代風格就是定義ipet佩特基。

該接口的優點是其他代碼可以使用它,而不與其他可執行代碼有任何聯系。完全“干凈”此外,接口也可以混合。

但是基類對于簡單的實現和常見的實用程序很有用。因此,還提供一個抽象基類來節省時間和代碼。


查看完整回答
反對 回復 2019-06-01
  • 3 回答
  • 0 關注
  • 739 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號