【问题标题】:this. vs base. for inherited protected non-virtual methods?这。与基地。对于继承的受保护的非虚拟方法?
【发布时间】:2013-04-26 06:32:50
【问题描述】:

在我的子类中,我应该将继承的受保护非虚拟方法称为this.Method() 还是base.Method()?

使用this 可以让我轻松地使用同名的新方法隐藏该方法。只有在确定只需要调用基类的实现时,才应该显式地指定 base 方法调用?

【问题讨论】:

  • 您应该在调用时始终调用 this.Method() 并从派生类中已实现的重写方法中调用 base::Method()。这样,将来当您覆盖某些内容时,您不必四处走动 base.Method();
  • 它不是虚拟方法,不能被覆盖。非虚方法只能隐藏。
  • 为什么不直接将其称为Method()?如果this 用自己的Method() 隐藏它,那么它将被调用。如果没有,base.Method() 将被调用。这被选为默认行为;可能有充分的理由。 ^_^
  • 因为它是一个非虚拟方法,所以不涉及功能多态性。为了清楚起见,我会选择 base.Method。
  • @Kurian - 对我来说很奇怪,明确调用 this.Method() 可读性较差。但如果 StyleCop 需要它,我会选择 this.Method(),因为这是标准行为。

标签: c# oop inheritance virtual protected


【解决方案1】:

如果你要在你的子类中添加一个名为Method 的成员并且仍然想调用继承的方法,你应该使用base.Method()。 在更多派生类中添加名为Method 的成员不会改变this.Method() 调用的含义。

【讨论】:

    【解决方案2】:

    始终使用this.Method() 调用。

    如果您隐藏该方法,您可能希望调用新方法而不是基类中的方法。另一方面,如果您将基类的方法设为虚拟,您可能希望代码以多态方式调用 if。

    很难预测未来,但这些情况似乎更有可能发生。

    【讨论】:

      猜你喜欢
      • 2016-03-17
      • 2023-03-23
      • 1970-01-01
      • 2015-03-26
      • 2020-09-09
      • 2014-04-08
      • 2016-05-20
      • 2012-06-13
      • 2013-11-03
      相关资源
      最近更新 更多