new 修饰符、虚方法、重写方法、抽象方法

new 修饰符

class-member-declaration 中可以使用与一个被继承的成员相同的名称或签名来声明一个成员。发生这种情况时,就称该派生类成员隐藏 (hide) 了基类成员。隐藏一个继承的成员不算是错误,但这确实会导致编译器发出警告。若要取消此警告,派生类成员的声明中可以包含一个 new 修饰符,表示派生成员是有意隐藏基成员的。如果在不隐藏所继承成员的声明中包含 new 修饰符,将对此状况发出警告。通过移除 new 修饰符可取消显示此警告。
 =======================================

虚方法

若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚方法。若其中没有 virtual 修饰符,则称该方法为非虚方法。非虚方法的实现是一成不变的:无论该方法是在声明它的类的实例上调用还是在派生类的实例上调用,实现均相同。与此相反,虚方法的实现可以由派生类取代。取代所继承的虚方法的实现的过程称为重写 (overriding) 该方法. 在虚方法调用中,该调用所涉及的那个实例的运行时类型 (run-time type) 确定了要被调用的究竟是该方法的哪一个实现。在非虚方法调用中,相关的实例的编译时类型 (compile-time type) 是决定性因素。准确地说,当在具有编译时类型 C 和运行时类型 R 的实例(其中 R 为 C 或者从 C 派生的类)上用实参列表 A 调用名为 N 的方法时,调用按下述规则处理:
• 首先,将重载决策应用于 C、N 和 A,以从在 C 中声明的和由 C 继承的方法集中选择一个特定的方法 M。
• 然后,如果 M 为非虚方法,则调用 M。
• 否则(M 为虚方法),就会调用就 R 而言 M 的派生程度最大的那个实现。
对于在一个类中声明的或者由类继承的每个虚方法,存在一个就该类而言的方法的派生程度最大的实现 (most derived implementation)。就类 R 而言虚方法 M 的派生度最大的实现按下述规则确定:
• 如果 R 中含有引入的 M 的 virtual 声明,则这是 M 的派生程度最大的实现。
• 如果 R 含有关于 M 的 override,则这是 M 的派生程度最大的实现。
• 否则,就 R 而言 M 的派生程度最大的实现与就 R 的直接基类而言 M 的派生程度最大的实现相同。
===============================================================

重写方法

若一个实例方法声明中含有 override 修饰符,则称该方法为重写方法 (override method)。重写方法用相同的签名重写所继承的虚方法。虚方法声明用于引入新方法,而重写方法声明则用于使现有的继承虚方法专用化(通过提供该方法的新实现)。
由 override 声明所重写的那个方法称为已重写了的基方法 (overridden base method)。对于在类 C 中声明的重写方法 M,已重写的基方法是通过检查 C 的各个基类类型来确定的,该检查过程如下:从 C 的直接基类类型开始检查,然后依次检查每个后续的直接基类类型,直到在给定的基类类型中至少找到一个在用类型实参替换后与 M 具有相同签名的可访问方法。为了查找已重写了的基方法,可访问方法可以这样来定义:如果一个方法是 public、是 protected、是 protected internal,或者是 internal 并且与 C 声明在同一程序中,则认为它是可访问的。
除非下列所有项对于一个重写声明皆为真,否则将会出现编译时错误:
• 可以按照上面描述的规则找到一个已重写了的基方法。
• 只有一个此类重写的基方法。此限制仅在基类类型是构造类型时(在这种情况下,用类型实参替换会使两个方法的签名相同)才有效。
• 该已重写了的基方法是一个虚的、抽象或重写方法。换句话说,已重写了的基方法不能是静态或非虚方法。 • 已重写了的基方法不是密封方法。
• 重写方法和已重写了的基方法具有相同的返回类型。
• 重写声明和已重写了的基方法具有相同的声明可访问性。换句话说,重写声明不能更改所对应的虚方法的可访问性。但是,如果已重写的基方法是 protected internal,并且声明它的程序集不是包含重写方法的程序集,则重写方法声明的可访问性必须是 protected。
• 重写声明不指定 type-parameter-constraints-clauses,而是从重写的基方法继承约束。
=======================================================

抽象方法

当实例方法声明包含 abstract 修饰符时,称该方法为抽象方法 (abstract method)。虽然抽象方法同时隐含为虚方法,但是它不能有 virtual 修饰符。抽象方法声明引入一个新的虚方法,但不提供该方法的实现。相反,非抽象类的派生类需要重写该方法以提供它们自己的实现。由于抽象方法不提供任何实际实现,因此抽象方法的 method-body 只由一个分号组成。只允许在抽象类中使用抽象方法声明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值