关闭

接口实现的继承机制

272人阅读 评论(0) 收藏 举报
接口实现的继承机制
 
一个类继承了它的基类所提供的接口实现,如果不显示的重新实现接口,派生类就无法改变从基类中继承来的接口映射
案例
     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来实现重载
 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:245234次
    • 积分:3373
    • 等级:
    • 排名:第10000名
    • 原创:21篇
    • 转载:306篇
    • 译文:3篇
    • 评论:42条