博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.net下继承与派生关系
阅读量:6567 次
发布时间:2019-06-24

本文共 1319 字,大约阅读时间需要 4 分钟。

自己用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 : AbsClass2     {3         override protected void method()4         {5             //sub class doing6         }7     }
View Code

 

转载于:https://www.cnblogs.com/ForDream/p/4521785.html

你可能感兴趣的文章
python-mysql的安装和基本操作
查看>>
tomcat 错误
查看>>
snappy 在linux安装及使用
查看>>
LAMP_apache安装_2
查看>>
Nginx+keepalived负载均衡高可用篇第③版
查看>>
《无线网络安全攻防实战》读书笔记
查看>>
回收 PV - 每天5分钟玩转 Docker 容器技术(152)
查看>>
[笔记] consul用grpc做健康检查注意点
查看>>
我的友情链接
查看>>
php采集 纠正一下
查看>>
phalcon遇到的那些坑
查看>>
单机部署open-falcon 0.2
查看>>
BTrace生产调试
查看>>
Matcher 类中的group(),group(int i),groupCount()
查看>>
Sublime使用的插件和快捷键
查看>>
Kotlin functions
查看>>
fegin通信中速度慢等待解决异常
查看>>
git stash和git stash pop
查看>>
趣图:好好干,今天再加个班
查看>>
Redhat linux5.5下Oracle 10g 安装配置手册一
查看>>