接口实现的继承机制
一个类继承了它的基类所提供的接口实现,如果不显示的重新实现接口,派生类就无法改变从基类中继承来的接口映射
案例
interface IBase
{
void Paint();
}
class Control:IBase
{
public void Paint()
{
Console.WriteLine("Control.Paint");
}
}
class test:Control
{
new public void Paint()
{
Console.WriteLine("test.Paint");
}
}
案例中test中的方法Paint覆盖了Control的方法Paint,但却没有改变Control.Paint对IBase.Paint的映射
,并且在类的实例和接口的实例中对Paint方法的调用会产生以下结果
static
void Main()
{
Control c = new Control();
test t = new test();
IBase ic =c;
IBase it =t;
c.Paint();
t.Paint();
ic.Paint();
it.Paint();
}
输出结果为
Control.Paint
test.Paint
Control.Paint
Control.Paint
也就是说test2的方法并没有改变IBase接口的映射
但是,当一个interface方法被映射到类的一个虚方法时,派生类就可以重载这个方法,并改变这个接口的实现。
也就是把上面的例子改成
class Control:IBase
{
public virtual void Paint()
{
Console.WriteLine("Control.Paint");
}
}
class test:Control
{
public override void Paint()
{
Console.WriteLine("test.Paint");
}
}
这样映射就发生了改变。
因为显示说明的接口成员不能被声明成虚,因此无法重载显示接口说明的实现。这时最好采用显示接口实现来调用另外一个方法,这个方法可以声明成虚,可以被重载
案例
class Control:IBase
{
void IBase.Paint()
{
this.PaintControl();
}
public virtual void PaintControl()
{
Console.WriteLine("canrewrite");
}
}
class test:Control
{
public override void PaintControl()
{
Console.WriteLine("berewrite");
}
}
这里显示接口成员可以执行可重载的方法PaintControl来实现重载