如何确定类与属性的关系(抽象和接口)

时间:2016-07-24 18:50:54

标签: c# oop interface abstract

根据Aamir的When to use an interface instead of an abstract class and vice versa?

  

当你派生一个Abstract类时,它之间的关系   派生类和基类是'是'关系。例如,一只狗   是动物,羊是动物,这意味着衍生类是   继承基类的一些属性。

     

然而,对于接口的实现,关系是" can   是&#34 ;.例如,狗可以是间谍犬。狗可以是马戏团的狗。一只狗   可以成为一只赛狗。这意味着您实现了某些方法   获得一些东西。

但是能力怎么样?喜欢,"一只狗可以吠叫#34;,#34;一只猫可以跳#34;,#34;蛇可以滑动",我将把它们放在一个抽象或界面中?

3 个答案:

答案 0 :(得分:1)

如果你有一些常见的能力,比如移动,你可以有一个接口,让抽象类实现这些方法(如果动物是你唯一可以使用的东西,那么你不会真正获得很多东西有这个界面,我相信)。如果您具有仅适用于某些派生类的特定功能,请让它们实现该接口。

狗吠似乎只是一个派生类的能力,为什么不让它由派生类实现呢?将它放在抽象类中意味着所有动物都能够吠叫,但是如果狗是你唯一能够吠叫的动物,那么再次让狗类实施一个有吠声的界面似乎有点奇怪。

附注:接口不一定要定义为“可以”关系。

答案 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)
    {
        ...
    }
}

对于上面的例子,抽象类的使用会很好,但对于大型复杂的项目,解决单继承问题可能会非常令人沮丧。

答案 2 :(得分:0)

还有另外一件事要考虑:您的实现类可以实现任意数量的接口,但您可以直接从一个类继承,抽象或具体。 简而言之:尽可能使用接口,并在必要时抽象类。