c# - 如何 "properly"覆盖基类方法?

标签 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();
     }
}

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

最佳答案

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/

相关文章:

javascript - 剑道 UI 网格 : I lose pagination after datasource refresh

mysql - 数据库设计-对象继承

css - 继承了哪些 CSS 属性?

JavaScript 模块模式 - protected 成员?

java - 它是否重载或覆盖?

c# - 在 HTTPS 上设置站点后,不允许子操作执行重定向操作

c# - 为什么 CLR 不总是调用值类型构造函数

c# - 向客户端发送 ICalendar 事件,同时继续运行您的代码

cocoa - 覆盖 NSSearchField "Clear field"行为

html - 有没有办法从标签中删除所有格式 - 并应用已经是 "in force"的任何样式?