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-通过SlidingPaneLayout高仿微信6.2最新版手势滑动返回(一)
    B树
    nyoj448 寻找最大数
    IT痴汉的工作现状22-由Dalvik虚拟机引发的口水战
    POJ 3221 Diamond Puzzle.
    CMDBuild安装及webservice接口的获取
    安卓dex 文件结构简要说明
    安装RPM包或者安装源代码包
    Java程序性能优化技巧
    [Sqlite]-->数据迁移备份--从低版本号3.6.2到高版本号3.8.6
  • 原文地址:https://www.cnblogs.com/netfork/p/3930.html
Copyright © 2011-2022 走看看