派生类方法隐藏继承成员

时间:2019-12-16 22:40:03

标签: c# inheritance

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

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关键字。

如何解决这个问题?

2 个答案:

答案 0 :(得分:7)

您无需再次将该方法重新声明为抽象方法,只需将其删除:

public abstract class DerivedClass1 : BaseClass {
}

但是您将需要提供一个构造函数,因为BaseClass没有默认的构造函数,并且需要实例化一个参数。

答案 1 :(得分:0)

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

隐藏是在构想OOP的想法时就很早就发明的。因此,每个人都实现了。我不记得曾经使用过,见过某人使用过,甚至认真地思考过在代码中使用它的想法。了解它的主要原因是不要偶然这样做而不是覆盖。

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

我很惊讶隐藏一直是编译器错误类。但是,我也遇到4个其他错误in that code。通常,有关访问器的信息与覆盖/隐藏行为不匹配(必须至少受保护,并且以后不能更改可访问性)。因此,很可能是这样的情况,即分析被绊倒了,它开始发明不会发生的问题。

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

相关问题