【问题标题】:Derived Class Method hides inherited member派生类方法隐藏继承的成员
【发布时间】:2019-12-16 22:40:03
【问题描述】:

我有一个基类和两个派生类:

public abstract class BaseClass {

    public IEnumerable<Double> Inputs { get; protected set; }

    public BaseClass(IEnumerable<Double> inputs) {

        foreach (Double input in inputs)
            Compute(input);
    } 

    protected abstract Double Compute(Double input);
}

public abstract class DerivedClass1 : BaseClass {

    protected abstract Double Compute(Double input);
}

public class DerivedClass2 : DerivedClass1 {

    private override Double Compute(Double input) {

    // Compute implementation

    }
}

我在DerivedClass1 Compute 方法上收到错误:

'DerivedClass1.Compute(Double)' 隐藏继承的成员'BaseClass.Compute(Double)'。要使当前成员覆盖该实现,请添加 override 关键字。

如何解决?

【问题讨论】:

  • 如错误所述,您可以在不覆盖的情况下覆盖成员。否则,如果它与 ot 派生的类是同一个成员,请不要提及。

标签: c# inheritance


【解决方案1】:

你不需要再把这个方法重新声明为abstract,去掉它即可:

public abstract class DerivedClass1 : BaseClass {
}

您需要提供构造函数,因为BaseClass 没有默认构造函数,需要实例化参数。

【讨论】:

  • 或者,您可以在 DerivedClass1 中声明 protected override abstract Double Compute(Double input);,但是......为什么。
  • 我之前从 DerivedClass1 中删除了 Compute,但后来我无法在 DerivedClass2 中将该方法设置为私有。错误是'DerivedClass2.Compute(double)': cannot change access modifiers when overriding 'protected' inherited member 'BaseClass.Compute(double)'
  • @MiguelMoura 我相信这种情况下的错误信息也是不言自明的。请参阅documentation:“覆盖声明不能更改虚拟方法的可访问性。覆盖方法和虚拟方法必须具有相同的访问级别修饰符。”
  • 知道了...我错过了一些东西。现在解决了。
【解决方案2】:

在继承类时,函数可能会发生两件事:覆盖和隐藏。

隐藏是在想到 OOP 的想法时很早就发明的一种东西。所以每个人都执行。我不记得曾经使用过、见过有人使用甚至认真考虑在代码中使用它。了解它的主要原因是不要意外这样做,而不是覆盖。

覆盖是更有用的方式。您在所有情况下都使用它 99.999%。唯一的缺点是必须启用和维护实现该功能的继承链的每个步骤的覆盖选项。如果遇到无法覆盖的情况,只有一个选项:只需将其封装在另一个我可以覆盖的类中。

我很惊讶将类隐藏为编译器错误。但是我也收到 4 个 other 错误in that code。主要是关于访问器与覆盖/隐藏行为不匹配的内容(它必须至少受到保护,之后您不能更改可访问性)。所以这很可能是解析被绊倒的情况,它开始发明不重要的问题。

只要一个类是抽象的,你就不需要编写任何代码。抽象类可以在类层次结构中获得“步骤”。我见过用于收集接口的抽象类,仅此而已。实际的实现仍然是 100% 的继承者工作。编写代码完全是可选的 - 不必编写代码通常是目标。

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 2018-08-18
    • 2012-02-13
    • 2010-09-05
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多