[C#] 區分 abstract、virtual、override 和 new
abstract、virtual、override和new是在類別的繼承關係中常用的四個修飾方法的關鍵字,在此略作總結。
1. 常用的中文名稱:
n abstract => 抽象方法。
n virtual => 虛擬方法。
n override => 覆蓋基礎類別方法。
n new => 隱藏基礎類別方法。
n override 和 new 有時都叫覆寫基礎類別方法。
2. 適用場合:
n abstract 和 virtual 用在基礎類別(父類別)中
n override 和 new 用在派(衍)生類別(子類別)中。
3. 具體概念:
n abstract 抽象方法,是空的方法,沒有方法實體,派(衍)生類必須以 override 實現此方法。
n virtual 虛擬方法,若希望或預料到基礎類別的這個方法在將來的派(衍)生類別中會被覆寫(override 或 new),則此方法必須被聲明為 virtual。
n override 覆寫繼承自基礎類別的virtural方法,可以理解為拆掉老房子,在原址上建新房子,老房子再也找不到了(基礎類別方法永遠調用不到了)。
n new 隱藏繼承自基礎類別的virtual方法,老房子還留着,在旁邊蓋個新房子,想住新房子的住新房子(作為衍生類別對象調用),想住老房子住老房子(作為基礎類別對象調用)。
n 當派(衍)生類別中出現與基礎類別同名的方法,而此方法前面未加 override 或 new 修飾符時,編譯器會報警告,但不報錯,真正執行時等同於加了new。
3. abstract 和 virtual 的區別:
n abstract 方法還沒實現,連累着基礎類別也不能被實例化,除了作為一種規則或符號外沒啥用;virtual 則比較好,派(衍)生類別想覆寫就覆寫,不想覆寫就吃老子的。
n 而且繼承再好也是少用為妙,繼承層次越少越好,派(衍)生類別新擴展的功能越少越好,virtual 深合此意。
4. override 和 new 的區別:
n 當派(衍)生類別對象作為基類類型使用時,override 的執行派(衍)生類別方法,new 的執行基礎類別方法。
n 如果作為派(衍)生類別類型調用,則都是執行 override 或 new 之後的。
http://jimmy0222.pixnet.net/blog/post/37271702-%5Bc%23%5D-%E5%8D%80%E5%88%86-abstract%E3%80%81virtual%E3%80%81override-%E5%92%8C-new
====转载, 很久没有跟踪C#语言了,没想到new又多了一个新作用.... 在语法层面,看来是走在java的前面了...
[C#] 區分 abstract、virtual、override 和 new的更多相关文章
- knowing abstract,virtual,override,new
If a class has at least one member which modified by "abstract",this class is an abstract ...
- C# abstract virtual override new finally java final finalize
virtual:声明虚方法.可以被其派生类所重写的.重写方法需要使用override或者new关键字. override:覆盖原方法.可对重写virtual.override.abstract进行重写 ...
- C# [method Modifiers] abstract virtual override new
abstract :表示方法是抽象方法,在子类中必须重写.抽象方法所在的类必须是抽象类,即用abstract modifiers:virtual:表示此方法是virtual方法,除了在子类中可以重写外 ...
- abstract,virtual,override个人
1.abstract 可以修饰类和方法,修饰方法时只声明不实现: 2.继承实现abstract类必须通过override实现abstract声明的方法,而virtual方法可选择override(重写 ...
- abstract,virtual,override
1.abstract 可以修饰类和方法,修饰方法时只声明不实现: 2.继承实现abstract类必须通过override实现abstract声明的方法,而virtual方法可选择override(重写 ...
- sealed、new、virtual、abstract与override 趣解
1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于 方法或属性时,sealed修饰符必须始终与override一起使用. ...
- Modifiers: virtual, override, new, abstract, sealed, internal
internal 声明类.类成员.接口或接口成员具有内部可见性. internal 修饰符使类.接口或成员仅在当前包中可见. 当前包之外的代码不能访问 internal 成员.只有在同一程序集的文件中 ...
- sealed、new、virtual、abstract与override 总结
1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于方法或属性时,sealed修饰符必须始终与override一起使用. ...
- abstract、override、new、virtual、sealed使用和示例
abstract修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽象类,则这个类智能是其他某个类的基类.抽象方法在抽象类中没有函数体.抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽 ...
随机推荐
- html 元素 变小手
要设置鼠标指针放在一个元素边界范围内时所用的光标形状,需要对元素的css属性cursor进行设置.cursor属性可能的值1.default 默认光标(通常是一个箭头)2.auto 默认.浏览器设置的 ...
- 22.I/O特性
IO资源 IO是与外界沟通和控制的通道,fpga提供了丰富的IO和一些实用的特性. 本文简要的将主要的特性摘录下来做设计参考用.具体参数参考handbook. 第一部分:IO特性概述 -----通过软 ...
- STL学习系列四:Stack容器
Stack简介 stack是堆栈容器,是一种“先进后出”的容器. stack是简单地装饰deque容器而成为另外的一种容器. #include <stack> 1.stack对象的默认构造 ...
- vs2013中使用nuget下载cefsharp winform包
cefsharp是chrome的一个开源项目,基于webkit的一个浏览器.下载cefsharp需要安装nuget.之后管理nuget程序包,联机搜索cef即可找到winform包.
- java笔试题(1)
char型变量中能不能存贮一个中文汉字? char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦.不过,如果某个特殊的汉字没 ...
- 团队开发---NABC分析
我们的软件初步构想的是版主同学们解决宿舍订桶装水的问题,随着夏季的来临,桶装水的需求量日益加大,而我们订水的过程中常常会遇到这样或那样的问题.再次我只对我们项目中可以直观的看到今日卖家总库存水量和剩余 ...
- How to Build FFmpeg for Android
http://www.roman10.net/how-to-build-ffmpeg-for-android/ ffmpeg is an open-source platform for record ...
- 计算器软件的代码实现 (策略模式+asp.net)
一 策略模式代码的编写 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// ...
- __int64 与long long 的区别 分类: Brush Mode 2014-08-14 10:22 64人阅读 评论(0) 收藏
//为了和DSP兼容,TSint64和TUint64设置成TSint40和TUint40一样的数 //结果VC中还是认为是32位的,显然不合适 //typedef signed long int ...
- 2014 ACM/ICPC Asia Regional Shanghai Online
Tree http://acm.hdu.edu.cn/showproblem.php?pid=5044 树链剖分,区间更新的时候要用on的左++右--的标记方法,要手动扩栈,用c++交,综合以上的条件 ...