如何"正确"覆盖基类方法?

Man*_*ani 35 c# inheritance overriding

每当我覆盖基类的方法时,除了我实现这个方法之外,我似乎有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();
     }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,子类如何知道(不看基类实现)父类所期望的顺序(或选项)?有没有一种方法可以让父类强制执行所有派生类的三个替换中的一个?

Ree*_*sey 40

子类如何知道(不看基类实现)父类所期望的顺序(或选项)?

在进行子类化和重写方法时,无法"知道"这一点.正确的文档确实是这里唯一的选择.

有没有一种方法可以让父类强制执行所有派生类的三个替换中的一个?

这里唯一的选择是避免这个问题.可以将其声明为非虚拟,而不是允许子类覆盖该方法,并在适当的位置调用虚方法.例如,如果要强制执行该子类"首先调用您的版本",您可以执行以下操作:

public class BaseClass {
    public void Method() // Non-virtual
    {
          // Do required work

          // Call virtual method now...
          this.OnMethod();
    }

    protected virtual void OnMethod()
    { // Do nothing
    }
 }
Run Code Online (Sandbox Code Playgroud)

然后子类可以"覆盖"OnMethod,并提供在"方法"工作之后发生的功能.

这是必需的原因是虚拟方法被设计为允许子类完全替换父类的实现.这是故意的.如果要防止这种情况,最好将该方法设为非虚拟方法.