abstract、virtual、override和new是在类别的继承关系中常用的四个修饰方法的关键字,在此略作总结。
1. 常用的中文名称:
abstract => 抽象方法。
virtual => 虚拟方法。
override => 覆盖基础类别方法。
new => 隐藏基础类别方法。
override 和 new 有时都叫复写基础类别方法。
2. 适用场合:
abstract 和 virtual 用在基础类别(父类)中
override 和 new 用在派(衍)生类别(子类)中。
3. 具体概念:
abstract 抽象方法,是空的方法,沒有方法实体,派(衍)生类必须以 override 实现此方法。
virtual 虚拟方法,可以有方法实体,若希望或预料到基类的这个方法在将来的派(衍)生类中会被复写(override 或 new),则此方法必须被声明为 virtual。
override 复写继承自基类的virtural方法,可以理解为拆掉老房子,在原址上建新房子,老房子再也找不到了(对于子类来说,基类方法永远调用不到了,当然父类对象能调用,但是子类强制转换为父类后仍然不能调用)。
new 隐藏继承自基类的virtual方法,老房子还留着,在旁边盖个新房子,想住新房子的住新房子(作为子类对象调用),想住老房子的住老房子(作为基类对象调用)。
当子类中出现与基类同名的方法,而此方法前面未加 override 或 new 修饰符时時,编译器会提出警告,但不报错,真正执行时等同于加了new。
3. abstract 和 virtual 的区别:
abstract 方法还沒实现,连累着基类也不能被实例化,除了作为一种规则或符号外沒什么用;virtual 则比较好,子类想复写就复写,不想复写就吃老子的。
4. override 和 new 的區別:
当子类对象作为基类类型使用时,override 的执行子类方法,new 的执行基类方法。
1. 常用的中文名称:
abstract => 抽象方法。
virtual => 虚拟方法。
override => 覆盖基础类别方法。
new => 隐藏基础类别方法。
override 和 new 有时都叫复写基础类别方法。
2. 适用场合:
abstract 和 virtual 用在基础类别(父类)中
override 和 new 用在派(衍)生类别(子类)中。
3. 具体概念:
abstract 抽象方法,是空的方法,沒有方法实体,派(衍)生类必须以 override 实现此方法。
virtual 虚拟方法,可以有方法实体,若希望或预料到基类的这个方法在将来的派(衍)生类中会被复写(override 或 new),则此方法必须被声明为 virtual。
override 复写继承自基类的virtural方法,可以理解为拆掉老房子,在原址上建新房子,老房子再也找不到了(对于子类来说,基类方法永远调用不到了,当然父类对象能调用,但是子类强制转换为父类后仍然不能调用)。
new 隐藏继承自基类的virtual方法,老房子还留着,在旁边盖个新房子,想住新房子的住新房子(作为子类对象调用),想住老房子的住老房子(作为基类对象调用)。
当子类中出现与基类同名的方法,而此方法前面未加 override 或 new 修饰符时時,编译器会提出警告,但不报错,真正执行时等同于加了new。
3. abstract 和 virtual 的区别:
abstract 方法还沒实现,连累着基类也不能被实例化,除了作为一种规则或符号外沒什么用;virtual 则比较好,子类想复写就复写,不想复写就吃老子的。
4. override 和 new 的區別:
当子类对象作为基类类型使用时,override 的执行子类方法,new 的执行基类方法。
如果作为子类类型来调用,则都是执行 override 或 new 之后的。
abstract:override
virtual:override、new
以上大部分内容来自:吉米.NET的博客