我想做:
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和网络上,但找不到任何关于这种行为。
我真的很感激有关这个问题的任何见解。
这是the fiddle。
答案 0 :(得分:4)
问题是基本方法是abstract
。继承自Concrete<T>
的类必须覆盖Base.Execute()
,但无法覆盖它,因为它被Derived<T>.Execute()
隐藏。因此,Concrete<T>
将是一个abstract
类,它不可能有任何实现(至少不在C#中),因此它将是无用的。所以,C#编译器不允许你编写它。
如果Base
是一个接口,您可以通过使用显式接口实现来解决此问题。但是没有什么比显式基类实现更好的了,所以我认为没有任何方法可以使用这种代码,至少在没有重命名这两种方法之一的情况下。
答案 1 :(得分:1)
来自MSDN:
抽象方法声明引入了一个新的虚方法 没有提供该方法的实现。代替, 非抽象派生类需要提供自己的派生类 通过覆盖该方法实现
嗯,这个错误的原因是抽象在C#中是如何工作的,抽象可以被继承,它可以被实现,但它不能被隐藏或被另一个抽象替换。
此外,请考虑代码:
public abstract class Base
{
public abstract Task Execute();
public abstract Task<int> Execute();
}
这不会编译,因为:
Type'Base'已经定义了一个名为'Execute'的成员 参数类型
那么当我们将第二个方法移动到派生抽象类时,为什么它应该工作呢?