C# selecd,new,virtual,abstract与override
本文大部分内容摘自 《.NET开发专家·亮剑.NET : .NET深入体验与实战精要》
博主只是搬运工,不喜勿喷。
关于虚方法,抽象类这一部分一直不是太清楚,目前的工作中也接触不到这些。
前几天下载了一本书,发现写的很形象,让我豁然开朗。
整理一下,再打一遍,加深理解,也帮助更多的初学者了解这部分知识。
1. sealed —— "断子绝孙"
密封类不能被继承。
密封方法可以重写基类中的方法。但其本身不能在任何派生类中进一步重写。
当应用于方法或属性时,scaled 修饰符必须同 override 一同使用。
2. new —— “我是你的,你是我的”
new 关键字用于显式隐藏从基类继承的成员,也就是说在使用派生类时调用的方法是 new 关键字新定义的方法,而不是基类的方法。
不使用 new 关键字隐藏成员也是可以的,但是会产生警告。使用 new 显式隐藏成员会取消次警告。
3. virtual —— “为了子孙和后代”
virtual 关键字用于修改方法或属性的声明,这种情况下,方法或属性被称作虚成员。虚成员的实现可又派生类中的重写成员更改。
调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
默认情况下,方法是非虚拟的。不能重写非虚方法。
virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。 除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
通过使用override修饰符在派生类中重写虚拟继承属性。
4. abstract —— “我是上帝”
abstract修饰符可以和 类,方法,属性,索引器以及事件一起使用。
在类声明中使用abstract修饰符以指示该类只能是其他类的基类。
抽象类的特性:
- 抽象类不能实例化。
- 抽象类可以包含抽象方法和抽象访问器。
- 不能用sealed修饰符修改抽象类,这意味着该类不能被继承。
- 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现。
- 从方法或属性声明中使用abstract修饰符以指示此方法或属性不包含实现。
抽象方法的特性
- 抽象方法是隐式的 virtual 方法。
- 只允许在抽象类中使用抽象方法声明。
- 抽象方法声明不提供实际的实现,所以没有方法体,方法声明以 ; 结束,并且签名后没有 {} 符号。如 public abstract void MyMethod();
- 实现方法由overriding方法提供,它是非抽象类的成员。
- 在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
- 除了在声明声明和调用方法上不同外,抽选属性的行为与抽象方法一样。
5. override —— "一手遮天"
使用override修饰符来修改方法,属性,索引器,或事件。主要提供派生类对基类方法的新实现,覆盖 abstract 与 virtual 两种修饰的成员。
重写的基类方法 必须与重写方法具有相同的签名。
重写的基类方法 必须是虚拟的,抽象的,或重写的。不能重写非虚方法或静态方法。
不能使用 new,static,virttual 和 abstract 关键字修改重写方法成员。
重写属性声明必须制定与继承属性完全相同的访问修饰符,类型,和名称。并且重写属性必须是虚拟的,抽象的,或重写的。
new 与 override 的相同点
- 都可以对基类成员进行隐藏,都可以使用 base 关键字调用基类成员
new 与 override 的区别
用 override 的基类的方法必须要用 virtual,而 new 不需要。
同一个基类对象调用基类的 virtual 方法时,override 重写的派生类的方法会被访问,而 new 重写的派生类的方法不会被访问。