c# – 继承一个接口,实现部分方法,让派生类实现其余的

定义以下C#界面:
public interface IShape
{
    int NumberOfLinesegments {get;}
    int Area {get;}
}

接下来,我想定义几个矩形类:梯形,正方形等.所有这些类在Area()属性中都有区别,但NumberOfLinesegments()总是返回4.因此,我想要一个名为Rectangle(或IRectangle)的“临时”类或接口,如下所示:

public Rectangle : IShape
{
    public int NumberOfLinesegments{get{return 4;}}
}

我想要Rectangle只实现NumberOfLinesegment(),并将其留给其派生类来实现其余的:

public Square : Rectangle 
{
    public int Area() {get{return length*height;}
}

然而,由于IShape是一个接口,Rectangle类还必须实现Area(),它不知道如何实现..
因此,我似乎被卡住了,无论是为Rectangle定义“虚拟”Area()方法,还是不使用继承.

有没有办法规避这个?我通过C#和StackOverflow广泛阅读了Richter的clr.提前致谢!

解决方法

有两个选择.

>使实现虚拟和空(或抛出一个NotImplementedException),因此认情况下不执行任何操作,直到派生.
>使基类抽象并为要强制链接的接口方法创建抽象签名.

第2号是更为可取的,因为它会强制派生类来实现该方法,而在第1个派生类中不会强制覆盖基本的虚拟方法.

抽象方法可以成功地满足接口定义,因为编译器将知道抽象类本身不能被实例化,并且任何派生类被强制实现抽象方法.

也就是说,如果有一些界面成员对特定类型没有意义,那通常是分解你的界面的一个指标:

public interface IShape : ICalculateArea,IHaveLinesegments
{
}

public interface ICalculateArea
{
    float Area { get; }
}

public interface IHaveLinesegments
{
    int NumberOfLinesegments { get; }
}

class Rectangle : IHaveLinesegments
{
    public int NumberOfLinesegments { get; private set; }
}

class Square : Rectangle,IShape
{
    public float Area { get; private set; }
}

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...