查看以下非编译C#代码:
public abstract class Operation
{
public abstract void Work();
}
public abstract class Operation<T> : Operation
{
public override void Work()
{
Work();
}
public new abstract T Work();
}
虽然可以在基类中引入一个新名称覆盖它,但似乎仍然无法覆盖基类中的前一个方法 - 为了进行覆盖,必须定义一个矛盾的方法。
有什么我忽略的或者这是不可能的吗?
答案 0 :(得分:1)
第一个选项,就像你可能不喜欢听到的那样,你可以简单地提出一个新的方法名称,而不是遮蔽另一个方法:
然而,另一个更激进的变化是Operation
是一个接口,而不是一个没有实现的抽象类。
public interface IOperation
{
void Work();
}
此时您也可以将继承类型作为接口,因为它不需要实现:
public interface IOperationWithResult<T> : IOperation
{
T Work();
}
或者你可以使它成为一个简单地实现接口的抽象类:
public abstract class Operation<T> : IOperation
{
public new abstract T Work();
void IOperation.Work()
{
Work();
}
}
我个人认为这里有两个接口而没有抽象类,因为这些类型在概念上不提供任何实际的实现,也不是概念抽象类型。他们的目的是定义一个许多其他无关类型可以满足的契约(即做一些工作或计算某些结果的能力),这正是接口的用途。