如何在新实现的接口或基类之间做出决定?

Sak*_*vel 29 c# asp.net interface base

在实现方面,我应该如何选择基本类型或接口?我尝试了几个例子,但我没有得到完整的想法:(

关于如何以及为什么的例子将受到高度赞赏..

Dan*_*Dan 43

基类(抽象与否,可以包含已实现的成员).界面不能.如果所有实现都要执行类似的操作,那么基类可能就是这样,因为所有子类都可以共享基类上成员的相同实现.如果他们不打算共享实现,那么接口可能是最佳选择.

例:

class Person
{
    string Name { get; set; }
}

class Employee : Person
{
    string Company { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Employee从Person继承是有意义的,因为Employee类不必定义Name属性,因为它共享实现.

interface IPolygon
{
    double CalculateArea()
}

class Rectangle : IPolygon
{
    double Width { get; set; }
    double Height { get; set; }

    double CalculateArea()
    {
        return this.Width * this.Height;
    }
}

class Triangle : IPolygon
{
    double Base { get; set; }
    double Height { get; set; }

    double CalculateArea()
    {
        return 0.5 * this.Base * this.Height;
    }
}
Run Code Online (Sandbox Code Playgroud)

因为Rectangle并且Triangle具有这样的不同实现CalculateArea,所以它们从基类继承是没有意义的.

如果你创建一个基类,并发现它只包含抽象成员,你也可以只使用一个接口.

并且,正如j__m所述,您不能从多个基类继承,但您可以实现多个接口.

我通常首先定义接口,如果我发现自己在我的实现中复制了代码,我创建了一个实现接口的基类,并使我的实现继承它.


Ali*_* B. 19

要决定是使用抽象类还是接口,我觉得这篇文章非常有用来源:

区分一个或另一个案例的好方法一直是:

  1. 是否有许多类可以"组合在一起"并由一个名词描述?如果是这样,请使用此名词的名称创建一个抽象类,并从中继承类.(A决胜盘关键的是,这些类共享功能,和你永远不会实例化只是一种动物 ......你总是实例某一种动物:你的实现动物基类)的 实例:可以从抽象的继承都class Animal,这个抽象基类将实现一个void Breathe()方法,所有动物都将以完全相同的方式进行操作.(我可能会把这个方法变成虚拟的,这样我就可以为某些动物覆盖它,比如Fish,它与大多数动物的呼吸不同).

  2. 什么类型的动词可以应用于我的班级,通常也可以应用于其他人?为每个动词创建一个接口. 示例:所有动物都可以喂食,因此我将创建一个名为IFeedable的界面,并让Animal实现它.虽然实现ILikeable只有DogHorse足够 - 我不会在基类上实现它,因为这不适用于Cat.

另请参阅此Interface vs Base类问题.