2016-04-02 225 views
3
  1. 基類實現接口的缺點/風險是什麼?
  2. 總是在子類上實現接口會更好嗎?
  3. 您什麼時候使用其中一種?基類實現接口

    public interface IFriendly 
    { 
        string GetFriendly(); 
    } 
    
    
    public abstract class Person: IFriendly 
    { 
        public abstract string GetFriendly(); 
    } 
    

    VS.

    public interface IFriendly 
    { 
        string GetFriendly(); 
    } 
    
    public abstract class Person 
    { 
        // some other stuff i would like subclasses to have 
    } 
    
    public abstract class Employee : Person, IFriendly 
    { 
        public string GetFriendly() 
        { 
         return "friendly"; 
        } 
    } 
    
+0

***全部***派生類將使用此實現在基類中實現;否則留下抽象。 –

回答

5

那麼,你需要考慮這樣的說法:

public interface IBreathing 
{ 
    void Breathe(); 
} 

//because every human breathe 
public abstract class Human : IBreathing 
{ 
    abstract void Breathe(); 
} 

public interface IVillain 
{ 
    void FightHumanity(); 
} 

public interface IHero 
{ 
    void SaveHumanity(); 
} 

//not every human is a villain 
public class HumanVillain : Human, IVillain 
{ 
    void Breathe() {} 
    void FightHumanity() {} 
} 

//but not every is a hero either 
public class HumanHero : Human, IHero 
{ 
    void Breathe() {} 
    void SaveHumanity() {} 
} 

的一點是,你的基類應該實現接口(或繼承,但只公開了其作爲抽象定義)只如果從它派生出來的其他類也應該實現該接口。 因此,通過上面提供的基本示例,只有在每個呼吸爲Human(這裏是正確的)時,纔會使Human執行IBreathing

但是!您無法使Human同時執行IVillainIHero,因爲這會使我們無法在以後分辨出是否是另一個。其實,這樣的實施意味着每一個Human既是一個惡棍又是一個英雄。

爲了結束回答你的問題:

  1. 什麼是實現一個接口的基類的缺點/風險?

    沒有,如果從它派生的每個類都應該實現該接口。

  2. 總是在子類上實現接口是否更好?

    如果每一個類從基地之一也應實現該接口派生,它是相當一個必須

  3. 當你使用一個或其他?

    如果從第一個派生的每個類都應該實現這樣的接口,那麼讓基類繼承它。如果不是,則創建具體的類實現這樣的接口。

2

從基類開始,將您與基類的實現聯繫起來。我們總是開始考慮基類正是我們想要的。然後我們需要一個新的繼承類,它不太適合,所以我們發現自己回去修改基類以適應繼承類的需求。它總是發生。

如果你從一個界面開始,那麼你有更多的靈活性。無需修改基類,只需編寫一個實現接口的新類即可。當它可以工作時,你可以獲得類繼承的好處,但是當它不起作用時,它不會被綁定到它。

當我第一次使用OOP時,我喜歡類繼承。令人驚訝的是,實際上它很少有結果。這就是Composition Over Inheritance的負責人進來的地方。最好從類的組合中構建功能,而不是將它嵌套在繼承的類中。

還有Open/Closed原理。如果你可以繼承,很好,但是你不想回頭去改變基類(並且冒險破壞其他東西),因爲新的繼承類需要正確的工作。編程到接口而不是基類可以保護您不必修改現有的基類。