惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
量子位
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
V
Visual Studio Blog
雷峰网
雷峰网
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
Blog — PlanetScale
Blog — PlanetScale
有赞技术团队
有赞技术团队
博客园 - 叶小钗
Microsoft Azure Blog
Microsoft Azure Blog
T
The Blog of Author Tim Ferriss
U
Unit 42
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
阮一峰的网络日志
阮一峰的网络日志
Y
Y Combinator Blog

博客园 - 栖息的熊

Mark一些关于线程同步的信息 【转载】安卓巴士Android开发神贴整理 关于Join 异常诡异的mysql连接异常:Fatal error encountered during command execution. 误人子弟的面试题答案 .Net中的安全机制 用定制特性规范构件调用 用重载操作符实现用户数据类型的转换 你必须知道的值传递和引用传递 windows用户配置文件的复制 求职:本人从事3年工作流引擎开发,熟悉XPDL,.net3.5中WF,Biztalk,开源工作流引擎OBE,期望工作地点上海 对Activity副本的再理解 Windows Workflow Foundation中实现人工活动的demo,按照XPDL规范的实现 WF消息队列的使用 查数据库死锁的实际例子 喜欢使用VMware的.net程序员要注意呀(Visual Studio启动不了的问题) 编译器错误信息: CS1595: 已在多处定义“ ”;一种可能出现的情况 BPM业务场景分析(1)——内部交易合并开票 高级工作流模式深入业务场景分析(1)——多路合并
override和new关键词的差别
栖息的熊 · 2008-10-03 · via 博客园 - 栖息的熊

继承和多态是我们常用的面向对象的特性,其中override和new关键词是我们最经常用到的,用下面的例子解释其用法。
假设我们我们有基类BaseClass和ChildClass,都有方法DoSomething。
在调用端使用下面的测试代码:
ChildClass cc = new ChildClass();
BaseClass bs = cc;
Console.Write(bs.DoSomething());

在基类和子类的DoSomething方法上的不同标记会对执行产生不同的影响。
override一般翻译成“覆盖”或“重写”,其完整的说法应该是子类中的方法覆盖基类中的方法;
new翻译成“隐藏”,其完整的说法应该是基类的方法隐藏子类中的方法。
下面描述标记不同,调用效果的不同。
a、如果基类和子类都没有特殊标记,按照“new”来处理,用基类引用指向子类对象,调用的是基类的方法;
b、如果基类未标记,子类标记为new,效果同a;
c、如果基类标记为virtual,子类未标记,效果还是同a;
d、如果基类标记virtual,子类标记为override,即为“覆盖”处理,用基类引用指向子类,调用的是子类的方法;
e、如果基类标记为virtual,子类标记为new,效果还是同a。

需要注意的是a和c会出现警告,提醒程序员使用清晰的写法。d和e是推荐的写法,明确的表明了用意。
对于b,即使基类中没有DoSomething方法,使用new标记也没有任何问题。但如果基类没有标记virtual,子类标记为override,则会出现编译时的错误。