【问题标题】:Overridable and Override in C# and VBC# 和 VB 中的可覆盖和覆盖
【发布时间】:2012-07-18 06:17:26
【问题描述】:

在 C# 中,override 默认是启用的,那么是否不需要在基类中显式声明一个方法为可重写的?如果是这样

  1. Overridable 是仅限于 VB.NET 还是在 C# 中也是必需的?
  2. 因此可以覆盖哪些类型的方法?它只是抽象类的抽象方法还是任何方法?

【问题讨论】:

  • 标记为virtual 的方法可以用override 关键字覆盖。覆盖方法仍然是虚拟的(尽管您不要重复 virtual 关键字)并且可以再次覆盖。要阻止该方法被进一步覆盖,请使用 sealed 关键字。
  • 正如下面其他人提到的,在C#中,如果以Abstract关键字为前缀,则默认情况下所有抽象方法都是虚拟的。这意味着方法签名只存在于抽象类中,但方法实现写在别处?
  • 正确。试试吧。首先编写一个类并标记类摘要。然后引入一个抽象方法,例如public abstract int GetNumber(); 如果你再写一个派生自第一个类的非抽象类,编译器会强制你提供一个GetNumber()的实现。
  • 另一个抽象类可以继承另一个抽象类吗?
  • 是的,当然。抽象类也可以继承非抽象类。

标签: c# .net oop


【解决方案1】:

VB 中的Overridable 关键字对应于C# 中的virtual 关键字。

您必须创建一个虚拟方法才能覆盖它。抽象方法是自动虚拟的。

【讨论】:

  • 最后我想知道什么时候使用抽象类?到目前为止,我从未觉得有必要将一个类声明为 Abstract。为什么不编写其他方法而不是覆盖现有方法?
  • @RPK:在创建基类时使用抽象成员,该基类的成员需要由继承该基类的所有类实现。
【解决方案2】:

在 C# 中,任何标记为“虚拟”的方法都可以被覆盖。标记为“抽象”的方法不一定被覆盖,它们在实现抽象类的类中实现。它们可以在实现中标记为虚拟。虚拟方法可以被覆盖的次数没有限制。

您需要 VB.NET 的答案吗?

【讨论】:

  • 不,您不能选择将抽象方法实现为虚拟或非虚拟。所有抽象方法都是自动虚拟的。
  • 抽象方法能否包含实现?
  • 抽象方法不能有实现..阅读此dotnetperls.com/abstract
  • 抽象方法自动是虚拟的。抽象方法(或属性)没有方法体(访问器体),只是指定了一个分号(;)。在从抽象类,当基类的抽象方法被实现,则各override关键字导出使用类(即使基方法没有实现)。跨度>
  • @RKh 在抽象类中可以有实现的方法。但是抽象方法本身不能有实现。这是使用虚拟方法的更好用例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2018-10-07
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
相关资源
最近更新 更多