zoukankan      html  css  js  c++  java
  • 接口实现的继承机制

    一个类继承了它的基类提供的所有接口的实现。
    如果不显式地重新实现接口,派生类就无法改变从基类中继承来的接口映射。
    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。
  • 相关阅读:
    android monkey测试学习
    学习python的*args和 **kwargs
    TotoiseSVN 使用参考文章
    脚本判断访问终端是什么内核的浏览器
    Git两分钟指南-学习入门参考
    访问WebServcie遇到配额不足的时候,请增加配额
    错误1083:配置成在该可执行程序中运行的这个服务不能执行该服务 【解决】
    C# 如何获取错误所在行数
    mysql中如何使用一句话将一个表的数据导入到另一个表中:insert into ...select
    Windows Server 2008 MetaFile设置占用内存限制
  • 原文地址:https://www.cnblogs.com/netfork/p/3930.html
Copyright © 2011-2022 走看看