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
要决定是使用抽象类还是接口,我觉得这篇文章非常有用来源:
区分一个或另一个案例的好方法一直是:
是否有许多类可以"组合在一起"并由一个名词描述?如果是这样,请使用此名词的名称创建一个抽象类,并从中继承类.(A决胜盘关键的是,这些类共享功能,和你永远不会实例化只是一种动物 ......你总是实例某一种动物:你的实现动物基类)的 实例:猫与狗可以从抽象的继承都class Animal,这个抽象基类将实现一个void Breathe()方法,所有动物都将以完全相同的方式进行操作.(我可能会把这个方法变成虚拟的,这样我就可以为某些动物覆盖它,比如Fish,它与大多数动物的呼吸不同).
什么类型的动词可以应用于我的班级,通常也可以应用于其他人?为每个动词创建一个接口. 示例:所有动物都可以喂食,因此我将创建一个名为IFeedable的界面,并让Animal实现它.虽然实现ILikeable只有Dog和Horse足够好 - 我不会在基类上实现它,因为这不适用于Cat.
另请参阅此Interface vs Base类问题.
| 归档时间: |
|
| 查看次数: |
22411 次 |
| 最近记录: |