【问题标题】:Is it possible to finalize a virtual method in C#?是否可以在 C# 中完成虚拟方法?
【发布时间】:2011-01-12 20:56:30
【问题描述】:

我的意思是,可以将 C# 中的虚方法标记为 final,这样从该类型派生的其他类型就不能再覆盖它了吗?

【问题讨论】:

  • 出于好奇,您的用例是什么?这是一个很少使用的功能。你有什么场景需要密封 method 而不是 class
  • @Eric:实际上我没有任何用例 :O 但发生的事情是这样的。我正在使用尚未发布的第 3 方 .NET 库。这个库有很多类型,它们只有内部构造函数。我想从这些派生出我自己的类型,但它的方式是不可能的,因为构造函数必须是公共的。我问他们,他们说虚拟方法会导致难以调试、棘手的错误,所以他们不能这样做。我隐约记得一种“最终确定”/密封虚拟方法的方法,所以这就是为什么我问这个,并告诉他们,如果他们担心,他们可以使用..
  • 密封关键字来密封这些虚拟方法。还告诉他们如果继承不适用于他们的库,那么应该密封类型以提高性能。但是由于这些类型具有内部构造函数,因此不可能真正使用它们。你怎么看?您认为他们对继承和虚方法的担忧是否有效?
  • 我的观点是可扩展性是一种特性,特性必须被设计、指定、实现、测试、记录、交付和维护。所有这些都增加了成本。您可以拥有一个未经过精心设计的可扩展类型,可能无法满足真正的客户需求,或者您可以花钱使其可适当扩展,或者您可以使其不可扩展。在预算有限的情况下,我个人倾向于选择第三种选择。
  • 他们有一个带有不可访问构造函数的非密封类的原因可能是因为他们想在内部进行继承,这比让继承可用的设计、测试、文档和维护负担更低。上市。如果他们不这样做,那么我同意最好也密封类,以明确表明其意图是创建一个不可继承的类。

标签: c# .net methods virtual


【解决方案1】:

是的:当覆盖一个方法时,你也可以声明它sealed

【讨论】:

  • 好答案。向 OP 澄清一点;只有虚拟方法的覆盖(它们本身也是虚拟的)可以被密封;具有virtual 的声明也不能是sealed。这是多余的;密封关键字“撤消”一个虚拟或抽象关键字,它使基类中的方法成为虚拟方法。在将方法设为虚拟和将其密封之间必须至少存在一层继承。
  • 谢谢 KeithS,你能给出一个代码示例吗?我不认为我理解它。
  • 基本上,public override sealed void MyMethod() 编译。 public virtual sealed void MyMethod() 没有,因为在同一继承级别,您将方法标记为可覆盖和不可覆盖。这是多余的; public void MyMethod() 将创建一个不可覆盖的方法。这就是我想要表达的观点;尽管虚拟方法可以被密封,但它们实际上必须是最初标记为虚拟的基方法的覆盖。
  • 谢谢,但是你能封印任何级别的虚方法吗?比如base中的一个方法是虚的,MyType:base能不能把这个方法封装在MyType中?
  • 除此方法作为虚拟成员存在的最高级别之外的任何级别。所以有一个 A 类,MyMethod 标记为虚拟,然后是 B:A 和 C:B。 B 或 C 都可以密封该方法,但 A 不能。
【解决方案2】:

您可以使用sealed

【讨论】:

    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多