接口实现的继承机制

一个类继承了它的基类提供的所有接口的实现。
如果不显式地重新实现接口,派生类就无法改变从基类中继承来的接口映射。
using System;

interface IControl
{
    void Paint();
}

class Control:IControl
{
    public void Paint() { Console.WriteLine("Control invoke!"); }
}

class TextBox:Control
{
    new public void Paint() { Console.WriteLine("TextBox invoke!"); }
}

class Invoke
{
    public static void Main()
    {
        Control c = new Control();
        TextBox t = new TextBox();
        IControl ic = c;
        IControl it = t;
        c.Paint();  // invokes Control.Paint();
        t.Paint();  // invokes TextBox.Paint();
        ic.Paint(); // invokes Control.Paint();
        it.Paint(); // invokes Control.Paint();

    }
}

但是,当一个interface方法被映射到类中的一个虚方法时,派生类就可以重载这个虚方法,并且改变这个接口的实现
interface IControl
{
    void Paint();
}
class Control:IControl
{
    public virtual void Paint() {...}
}
class TextBox:Control
{
    public override void Paint() {...}
}
代码效果:
Control c = new Control();
TextBox t = new TextBox();
IControl ic = c;
IControl it = t;
c.Paint();  // 调用Control.Paint();
t.Paint();  // 调用TextBox.Paint();
ic.Paint(); // 调用Control.Paint();
it.Paint(); // 调用TextBox.Paint();


  因为显式说明的接口成员不能被声明为虚的,因此无法重载显式说明的接口实现。
  这时最好采用显式说明的接口实现来调用另一个方法,这个被调用的方法可以被声明为虚的,允许被派生类重载。
interface IControl
{
    void Paint();
}
class Control:IControl
{
    void IControl.Paint() {PaintControl();}
    protected virtual void PaintControl() {...}
}
class TextBox:Control
{
    protected override void PaintControl() {...}
}
这里,从Control中派生的类可以通过重载PaintControl方法来具体实现IControl.Paint。
原文地址:https://www.cnblogs.com/netfork/p/3930.html