我有一个基类和两个派生类:
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关键字。
如何解决这个问题?
答案 0 :(得分:7)
您无需再次将该方法重新声明为抽象方法,只需将其删除:
public abstract class DerivedClass1 : BaseClass {
}
但是您将需要提供一个构造函数,因为BaseClass
没有默认的构造函数,并且需要实例化一个参数。
答案 1 :(得分:0)
继承类时,函数会发生两件事:覆盖和隐藏。
隐藏是在构想OOP的想法时就很早就发明的。因此,每个人都实现了。我不记得曾经使用过,见过某人使用过,甚至认真地思考过在代码中使用它的想法。了解它的主要原因是不要偶然这样做而不是覆盖。
覆盖是更有用的方法。在所有情况下都使用它的99.999%。唯一的缺点是必须启用重写选项,并在实现该功能的继承链的每个步骤中都应保留该选项。如果遇到无法覆盖的情况,则只有一个选择:将其封装在我可以覆盖的另一个类中。
我很惊讶隐藏一直是编译器错误类。但是,我也遇到4个其他错误in that code。通常,有关访问器的信息与覆盖/隐藏行为不匹配(必须至少受保护,并且以后不能更改可访问性)。因此,很可能是这样的情况,即分析被绊倒了,它开始发明不会发生的问题。
只要一个类是抽象的,就不需要编写任何代码。抽象类在那里可以在类层次结构中获得“进步”。我看到了用于收集接口的抽象类,仅此而已。实际的实现仍然是继承者工作的100%。将内容编码是完全可选的-不必将内容编码通常是目标。