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



根据Aamir在何时使用接口而不是抽象类,反之亦然?

当派生抽象类时派生类和基类是"is a"关系。例如,一只狗是动物,绵羊是动物,这意味着派生类从基类继承一些属性。

而对于接口的实现,关系是"可以例如,狗可以是间谍狗。狗可以是马戏团的狗。狗可以成为比赛犬。这意味着你要实现某些方法获得一些东西。

但是能力呢?比如,"狗会吠叫"、"猫会跳"、"蛇会滑",我会把这些放在哪里,放在抽象或界面中?

如果你有一些共同的能力,比如move,你可以有一个这些能力的接口,并让抽象类实现这些方法(如果你只会使用动物,那么我相信拥有这个接口你不会有多大收获)。如果您具有仅适用于某些派生类的特定功能,请让它们实现接口。

犬吠似乎只是一个派生类的能力,为什么不让它由该派生类实现呢?把它放在抽象类中意味着所有动物都能吠叫,但如果狗是你唯一能吠叫的动物,那么让狗类实现一个有吠叫的接口似乎有点奇怪。

附带说明:接口不一定要定义为"可以是"关系。

执行某些操作的能力可能最适合接口,除非您希望在未实现该方法的情况下提供一些默认行为。

请记住,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)
    {
        ...
    }
}

对于上面的例子,使用抽象类是可以的,但对于大型、复杂的项目,处理单个继承问题可能会变得非常令人沮丧。

还有一件事需要考虑:实现类可以实现任意多的接口,但只能直接从一个类继承,无论是抽象的还是具体的。简而言之:尽可能使用接口,必要时抽象类。

最新更新