2016-07-24 28 views
0

When to use an interface instead of an abstract class and vice versa?如何確定的一類根據阿米爾性質(摘要和接口)

的關係時得到一個抽象類,所述 派生類和基類之間的關係是「是一種'關係。例如狗 是動物,羊是動物,這意味着派生類是 繼承了基類的一些屬性。

而對於接口的實現,關係是「can be」。例如,狗可以是間諜狗。狗可以是馬戲團的狗。狗 可以是種族狗。這意味着你實現了某些方法來獲取一些東西 。

但是能力如何?例如,「狗可以吠叫」,「貓可以跳躍」,「蛇可以滑動」,我會在哪裏將它們放在抽象或界面中?

回答

1

如果你有一些常見的能力,比如移動,你可以有一個接口,並讓抽象類實現這些方法(如果動物是你唯一能夠使用的東西,那麼你真的不會獲得太多通過擁有那個接口我相信)。如果你有特定的能力只適用於某些派生類,讓他們實現接口。

狗吠似乎只是一個派生類的能力,爲什麼不讓它由派生類來實現呢?把它放在抽象類中意味着所有的動物都可以吠叫,但是如果狗是你唯一能夠吠叫的動物,那麼再次擁有一個狗類實現一個有樹皮的界面似乎有點奇怪。

備註:接口不一定要定義爲「可以」的關係。

0

執行某些操作的能力可能最適合於接口,除非您希望在未實現方法時提供某些默認行爲。

請記住,C#不支持從多個類繼承,但支持實現多個接口。這允許一些靈活性。像這樣的:

interface IBreathes() 
{ 
    void Breathe(); 
} 

interface IMoveable() 
{ 
    void Move(int x, int y); 
} 

class Snake : Animal, IBreathes, IMoveable 
{ 
    void Breathe() 
    { 
     ... 
    } 

    void Move(int x, int y) 
    { 
     ... 
    } 
} 

對於上面的例子中使用抽象類的就可以了,但與大型,複雜的項目可能變得非常沮喪地解決了單繼承的問題。

+0

對所有的動物都有共同的東西(比如呼吸和移動)不是更好嗎,是他們派生的抽象類的一部分嗎?這樣你就不必讓所有的派生實現都具有相同的接口。 – Memfisto

+0

這超出了我的想法,你可能會爭論任何一種方式。主要問題是,如果你不想在從* Animal *派生的東西中包含一個方法,那麼你必須重構整個* Animal *類或者編寫第二個* Animal *類。 這對接口來說很簡單:你只是不使用那個接口。 – Toneo

+0

當然,但一些必需品不可能改變。如果他們這樣做,你可以用一個空白的方法重新實現它們作爲最壞的情況。但我同意,在更改代碼時,添加/刪除界面是更簡單的解決方案。 – Memfisto

0

還有一件事需要考慮:您的實現類可以實現儘可能多的接口,但您可以直接從一個類繼承,抽象或具體。簡而言之:儘可能地使用接口,並在必要時抽象類。