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。
  • 相关阅读:
    变参宏 __VA_ARGS__
    预处理中的 # 和 ##
    strlen与sizeof异同
    .vimrc
    sudo:有效用户 ID 不是 0,sudo 属于 root 并设置了 setuid 位吗
    远程ssh登陆时报错:/bin/bash: Permission denied
    Excel中VBA进行插入列、格式化、排序
    ORACLE发送带附件邮件的二三事之一
    Windows Server 2008 双网卡同时上内外网 不能正常使用
    VMWARE修改CPUID
  • 原文地址:https://www.cnblogs.com/netfork/p/3930.html
Copyright © 2011-2022 走看看