2014-02-05 65 views
1

请看下面的非编译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(); 
} 

虽然可以引入一个新的名字在基类中重写一个,它似乎并没有被可能仍然覆盖基类中的前一个方法 - 为了执行覆盖,必须定义冲突的方法。

有没有我忽略的东西,或者这是不可能做到的?

+2

方法不能因返回类型而异 – vmeln

+0

当您遇到编译器错误时,请尝试读取它。如果你不理解它,请提出一个关于它的问题,但请包括错误信息。 –

+1

尝试在新的Work方法中放置base.Work()。它应该是“新的虚拟”,而不是抽象的 – Frode

回答

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(); 
    } 
} 

个人而言,我会去有两个接口,在这里没有抽象类,因为这些类型不是概念提供任何实际的实现,也不是他们在概念上抽象类型。他们的目的是定义一个合同,即许多其他不相关的类型可以满足的合约(即做某些工作或计算某种结果的能力),这正是接口的用途。

+0

使用不同名称的方法是我通常做的,是的,使一个接口也可以工作。我只是觉得可能有更好的办法。 – John

+0

@John有一个更好的方法。使用两个接口。正如我所说,这是这里最好的解决方案。真的没有任何理由有任何抽象类。作为一般性建议,我建议你一般谨慎使用抽象类。我发现他们很少是大多数任务的合适工具。 (这通常归结为古老的说法:“支持组合而不是继承”。) – Servy