【发布时间】:2014-05-28 11:58:15
【问题描述】:
我有一个基础抽象类,它也实现了一个特定的接口。
public interface IMovable<TEntity, T>
where TEntity: class
where T: struct
{
TEntity Move(IMover<T> moverProvider);
}
public abstract class Animal : IMovable<Animal, int>
{
...
public virtual Animal Move(IMover<int> moverProvider)
{
// performs movement using provided mover
}
}
然后我继承了一些类,其中一些必须重写基类的接口实现方法。
public class Snake : Animal
{
...
public override Animal Move(IMover<int> moverProvider)
{
// perform different movement
}
}
我的接口方法在移动后返回相同的对象实例,因此我可以使用 chaining 或直接在 return 语句中执行某些操作,而无需使用其他变量。
// I don't want this if methods would be void typed
var s = GetMySnake();
s.Move(provider);
return s;
// I don't want this either if at all possible
return (Snake)GetMySnake().Move(provider);
// I simply want this
return GetMySnake().Move(provider);
问题
正如您在我的示例中看到的,我在子类中的覆盖返回基类类型而不是运行类。这可能需要我转换结果,我想避免这种情况。
如何定义我的接口和实现,以便我的覆盖将返回执行实例的实际类型?
public Snake Move(IMover<int> moverProvider) {}
【问题讨论】:
-
可能更简单地重新组织类并执行以下操作: return provider.Move(GetMySnake());在这种情况下,Move() 将返回与参数相同的对象,如果需要,您可以使用通用方法?
标签: c# generics inheritance interface-implementation