基类(抽象或非抽象)可以包含实现的成员.接口不能.如果您的所有实现都将以类似的方式执行,那么基类可能是最佳 Select ,因为您的所有子类都可以共享基类上成员的相同实现.如果他们不打算共享实现,那么一个接口可能是最好的 Select .
例子:
class Person
{
string Name { get; set; }
}
class Employee : Person
{
string Company { get; set; }
}
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;
}
}
因为Rectangle
和Triangle
对CalculateArea
有如此不同的实现,所以它们从基类继承是没有意义的.
如果您创建了一个基类,并且发现only中包含抽象成员,那么您也可以只使用一个接口.
而且,正如j_m所说,您不能从多个基类继承,但可以实现多个接口.
我通常首先定义接口,如果我发现自己在实现中重复代码,我会创建一个实现该接口的基类,并使我的实现继承它.