2

我想做:

public abstract class Base
{
    public abstract Task Execute(); 
}

public abstract class Concrete<T> : Base where T : class
{
    new public abstract Task<T> Execute();
}

但由于某种原因,我收到了编译器错误:

CS0533 'Concrete.Execute()' 隐藏继承的抽象成员 'Program.Base.Execute()

我过去隐藏了很多成员,但从未遇到过这种情况,对此我感到很困惑。在 MSDN 和网络上花了很长时间,但找不到任何关于这种行为的信息。

我非常感谢您对这个问题的任何见解。

这是小提琴

4

2 回答 2

4

问题是基本方法是abstract. 继承自的类Concrete<T>必须覆盖Base.Execute()但它不能覆盖它,因为它被 隐藏Derived<T>.Execute()。因此,Concrete<T>将是一个abstract不可能有任何实现的类(至少在 C# 中没有),因此它是无用的。因此,C# 编译器不允许您编写它。

如果Base是接口,您可以通过使用显式接口实现来解决此问题。但是没有像显式基类实现这样的东西,所以我认为没有任何方法可以拥有这种代码,至少没有重命名这两种方法之一。

于 2016-09-07T17:00:13.837 回答
1

来自 MSDN:

抽象方法声明引入了新的虚拟方法,但不提供该方法的实现。相反,非抽象派生类需要通过覆盖该方法来提供自己的实现

嗯,这个错误的原因是抽象在 C# 中是如何工作的,抽象可以被继承,它可以被实现但它不能被隐藏或被另一个抽象替换。

此外,考虑代码:

public abstract class Base
{
    public abstract Task Execute();
    public abstract Task<int> Execute();
}

这不会编译,因为:

类型“Base”已经定义了一个名为“Execute”的成员,具有相同的参数类型

那么,当我们将第二种方法移至派生抽象类时,为什么它会起作用呢?

于 2016-09-07T17:02:04.137 回答