.net下继承与派生关系

本身用C#写个东西玩的,碰到点面向对象的问题,代码以下:ide

    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,若是继承类重写了则调用继承类。spa

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

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

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

所以,要实现我最初的的想法,只须要简单在继承类中显式的申明override便可。blog

1     class RideClass : AbsClass
2     {
3         override protected void method()
4         {
5             //sub class doing
6         }
7     }
View Code
相关文章
相关标签/搜索