这。与基地。对于继承的受保护的非虚拟方法?
Posted
技术标签:
【中文标题】这。与基地。对于继承的受保护的非虚拟方法?【英文标题】: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()
,因为这是标准行为。
【参考方案1】:
如果你要在你的子类中添加一个名为Method
的成员并且仍然想调用继承的方法,你应该使用base.Method()
。
在更多派生类中添加名为Method
的成员不会改变this.Method()
调用的含义。
【讨论】:
【参考方案2】:始终使用this.Method()
调用。
如果您隐藏该方法,您可能希望调用新方法而不是基类中的方法。另一方面,如果您将基类的方法设为虚拟,您可能希望代码以多态方式调用 if。
很难预测未来,但这些情况似乎更有可能发生。
【讨论】:
以上是关于这。与基地。对于继承的受保护的非虚拟方法?的主要内容,如果未能解决你的问题,请参考以下文章