C#设计模式-派生类实现非虚接口陷阱的实例代码分享

黄舟
发布: 2017-03-18 13:23:43
原创
1612人浏览过

理解接口方法和虚方法的区别

  第一眼看来,实现接口和覆写虚方法似乎没有什么区别,实际上,实现接口和覆写虚方法之间的差别很大!!!

派生不能覆写接口的非虚成员

  接口中声明的成员方法默认情况下并非虚方法,所以,派生类不能覆写基类中实现接口的非虚成员
看一个例子。
定义接口ITest:

    public interface ITest
    {        void Test();
    }
登录后复制

实现接口的Base类和Derive类

    public class Base:ITest
    {        public Base()
        {
            Console.WriteLine("This is base constructor");
        }        //实现ITest接口
        public void Test()
        {
            Console.WriteLine("This is in base to ITest implement");
        }
    }    public class Derive :Base,ITest
    {        public Derive()
        {
            Console.WriteLine("This is derived constructor");

        }        //测试Derive类实现了ITest吗??
        public void Test()
        {
            Console.WriteLine("This is in Derive to ITest implement");
        }
    }
登录后复制

调用对象Base和Derive:

            Base b = new Base();
            b.Test();

            Base d = new Derive();//将d声明为Base对象
            d.Test();
            Console.ReadLine();
登录后复制

输出结果为:


这里写图片描述

  可以看出,b和d实例的Test方法实现的行为都是位于基类的!!!这表明了,派生类不能覆写基类中实现接口的成员(非虚方法)

但是,请看下面调用:

            Base b = new Base();
            b.Test();
            Derive d = new Derive(); //将d声明为Derive对象
            d.Test();
            Console.ReadLine();
登录后复制

输出结果为:


这里写图片描述

因此,如果想要继承的对象调用接口实现方法,只能声明为Derive实例。这样做不符合Effective C#变量都声明为基实例的原则!!!

派生类方法个性,将基类方法转为虚方法

  避免这种使用上的混淆,如果确实派生类实现方法是个性行为,那么需要将基类的实现接口的方法前加virtual修饰符!
代码修改如下:

public class Base:ITest
    {        public Base()
        {
            Console.WriteLine("This is base constructor");
        }        public virtual void Test() //实现ITest接口的虚方法
        {
            Console.WriteLine("This is in base to ITest implemnt");
        }
    }    public class Derive :Base,ITest
    {        public Derive()
        {
            Console.WriteLine("This is derived constructor");

        }         public override void Test() //实现接口ITest的复写方法
        {
            Console.WriteLine("This is in Derive to ITest implemnt");
        }
    }
登录后复制

一次实现,多个关联对象使用

  观察上面的代码,我们发现,在基类中实现的接口,如果派生类也想实现此接口,那么它默认继承了基类的接口实现,所以不用重复写代码实现接口。

   public interface ITest
    {        void Test();
    }    public class Base:ITest
    {        public Base()
        {
            Console.WriteLine("This is base constructor");
        }        public void Test()
        {
            Console.WriteLine("This is in base to ITest implemnt");
        }
    }    public class Derive :Base,ITest
    {        public Derive()
        {
            Console.WriteLine("This is derived constructor");

        }
    }
登录后复制

总结:
1、 派生不能覆写接口的非虚成员;
2、如果派生类方法是个性方法,将基类方法转为虚方法;
3、若基类实现了接口方法,将派生类也显示地继承此接口,但是不用再次实现了!!!

以上就是C#设计模式-派生类实现非虚接口陷阱的实例代码分享的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号