每当我重写一个基类的方法时,除了我对这个方法的实现之外,我似乎有 3 个选择。
1) 调用base.Method(),然后提供我的实现。
2) 提供我的实现然后调用base.Method()
3) 只需提供我的实现即可。
最近在使用一个库时,我发现由于没有按照库的预期实现方法而引入了一些错误。我不确定这是否对库的一部分不好,或者我的理解有问题。
我举一个例子
public class ViewManager {
public virtual void Customize(){
PrepareBaseView();
}
}
public class PostViewManager {
public override void Customize(){
base.Customize();
PreparePostView();
}
}
public class PreViewManager {
public override void Customize(){
PreparePreView();
base.Customize();
}
}
public class CustomViewManager {
public override void Customize(){
PrepareCustomView();
}
}
我的问题是,子类如何知道(不查看基类实现)父类期望哪个顺序(或选项)? 有没有一种方法可以让父类对所有派生类强制执行三个替代项之一?
最佳答案
how could a child class know (without taking a look at base class implementation) which order (or option) is being expected by the parent class?
当您子类化和重写一个方法时,没有办法“知道”这一点。正确的文档确实是这里唯一的选择。
Is there a way in which parent class could enforce one of the three alternates to all the deriving classes?
这里唯一的选择是避免这个问题。与其让子类重写该方法,不如将其声明为非虚拟的,并在适当的地方调用虚拟方法。例如,如果你想强制子类“首先调用你的版本”,你可以这样做:
public class BaseClass {
public void Method() // Non-virtual
{
// Do required work
// Call virtual method now...
this.OnMethod();
}
protected virtual void OnMethod()
{ // Do nothing
}
}
然后子类可以“覆盖”OnMethod,并提供在“方法”工作之后发生的功能。
之所以需要这样做,是因为虚方法的设计目的是让子类完全替代父类的实现。这是故意的。如果要防止这种情况发生,最好使该方法成为非虚方法。
关于c# - 如何 "properly"覆盖基类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3152996/