Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 派生类方法隐藏继承的成员_C#_Inheritance - Fatal编程技术网

C# 派生类方法隐藏继承的成员

C# 派生类方法隐藏继承的成员,c#,inheritance,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); }

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

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

    }
}
公共抽象类基类{
公共IEnumerable输入{get;protected set;}
公共基类(IEnumerable输入){
foreach(输入中的双输入)
计算(输入);
} 
受保护的抽象双计算(双输入);
}
公共抽象类DerivedClass1:基类{
受保护的抽象双计算(双输入);
}
公共类DerivedClass2:DerivedClass1{
专用覆盖双计算(双输入){
//计算实现
}
}
我在
DerivedClass1
Compute
方法中得到错误:

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


如何解决此问题?

您不需要再次将此方法声明为抽象,只需将其删除:

public abstract class DerivedClass1 : BaseClass {
}

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

继承类时,函数可能会发生两种情况:重写和隐藏

隐藏是一种很早就在提出OOP概念时发明的东西。所以每个人都实现了。我不记得曾经使用过,见过有人使用过,甚至没有认真考虑过在代码中使用它。了解它的主要原因是,不要意外地执行它,而不是覆盖它

重写是一种更有用的方法。99.999%的情况下你都会使用它。唯一的缺点是重写选项必须在实现函数的继承链的每一步都启用和维护。如果遇到无法重写的情况,只有一个选项:将其封装到另一个可以重写的类中

我很惊讶,隐藏类一直被视为编译器错误。然而,我也收到了4个其他错误。主要是关于访问器与覆盖/隐藏行为不匹配的内容(它必须至少受到保护,之后不能更改可访问性)。因此,在这种情况下,解析很可能会出错,它开始发现一些无关紧要的问题


只要类是抽象的,就不需要编写任何代码。抽象类是为了获得类继承权中的“步骤”。我见过用于收集接口的抽象类,仅此而已。实际实现仍然是继承者作业的100%。对内容进行编码完全是可选的-不必对内容进行编码通常是目标。

错误说明,您可以在不重写的情况下重写成员。否则,如果它与ot派生的类是同一个成员,则不要提及它在DerivedClass1中,但是。。为什么。我以前从
DerivedClass1
中删除了Compute,但后来我无法在
DerivedClass2
中将该方法设置为private。错误是'DerivedClass2.Compute(double)':在重写'protected'继承成员'BaseClass.Compute(double)@MiguelMoura我相信这种情况下的错误消息也是自我解释的。请参阅:“重写声明无法更改虚拟方法的可访问性。重写方法和虚拟方法必须具有相同的访问级别修饰符。”明白了。。。我错过了一些东西。现在解决了。