• .net下继承与派生关系


    自己用C#写个东西玩的,碰到点面向对象的问题,代码如下:

        abstract class AbsClass
        {
            virtual protected void method()
            {
                //do something
            }
            public void doMethod()
            {
                //do something
                method();
                //do other things
            }
        }
    
        class RideClass : AbsClass
        {
            protected void method()
            {
                //sub class doing
            }
        }
    
        class Execute
        {
            public void main()
            {
                AbsClass c = new RideClass();
                c.doMethod();
            }
        }
    

     我原意是希望在抽象类中调用的method方法,如果继承类没有重写,则调用抽象类的method,如果继承类重写了则调用继承类。

    但是事情往往事与愿违,其结果是无论如何都不会调用继承类的method方法。此时,如果将doMethod方法移到继承类中(例子中就是RideClass),则可以实现我的要求,但这显然违背了面向对象的初衷,也不利于后期的维护。

    因此,我就跑到MSDN上去询问了有关问题,最终圆满解决。在其他语言平台不清楚,至少在.net framework(C#语言,其他语言一样 只是关键字可能不同)里,如果需要使用“派生——继承”的关系,则必须显式的申明virtual-override关键字。

    在这个例子中,AbsClass.method方法使用了virtual修饰,但是RideClass.method方法并没有override修饰符(没有override修饰,自动认为使用了new修饰符),因此在C#中,编译器认为该方法仅仅是与父类方法的一个同名方法而已,除此之外不再有任何关系。并且在子类中,将父类的method方法进行了隐藏。所谓“隐藏”,即实例化一个RideClass类的实例,该实例将不可见父类的method方法(例子中,本来就不可见,因为访问限制符是protected)。

    因此,要实现我最初的的想法,只需要简单在继承类中显式的申明override即可。

    1     class RideClass : AbsClass
    2     {
    3         override protected void method()
    4         {
    5             //sub class doing
    6         }
    7     }
    View Code
  • 相关阅读:
    Vue 监听子组件事件
    延时队列
    AES加密
    centos7.9 iftop 工具源码安装
    angular pass get paragrams by router
    Android chrome console in PC
    powershell 运行带路径的exe
    win下 nrm ls报错
    windows10 安装 node 16 解决node-sass node-gyp报错
    位图和布隆过滤器
  • 原文地址:https://www.cnblogs.com/ForDream/p/4521785.html
Copyright © 2020-2023  润新知