• 技术文章 >后端开发 >C#.Net教程

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

    黄舟黄舟2017-03-18 13:23:43原创867

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

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

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

      接口中声明的成员方法默认情况下并非虚方法,所以,派生类不能覆写基类中实现接口的非虚成员
    看一个例子。
    定义接口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();

    输出结果为:


    这里写图片描述

    php入门到就业线上直播课:进入学习


      可以看出,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中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    上一篇:.NET框架-Clone如何由浅变深的示例代码详解 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• c语言中源文件编译后生成什么文件• C#中GDI+编程10个基本技巧二• 应用绝对路径与相对路径• ASP.NET使用Ajax如何返回Json对象的方法具体介绍• 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误
    1/1

    PHP中文网