我有一个基抽象类,它也实现了特定的接口。
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);
Question
正如您在我的示例中看到的,我在子类中的重写返回基类类型而不是运行类。这可能需要我投射结果,这是我想避免的。
如何定义接口和实现,以便我的重写返回执行实例的实际类型?
public Snake Move(IMover<int> moverProvider) {}
我建议将接口方法的返回类型更改为void
并将链接行为移至扩展方法,您可以在其中获取目标的真实类型,例如
public interface IMovable<TEntity, T>
where TEntity : class
where T : struct
{
void MoveTo(IMover<T> moverProvider);
}
public abstract class Animal : IMovable<Animal, int>
{
public virtual void MoveTo(IMover<int> mover) { }
}
public static class AnimalExtensions
{
public static TAnimal Move<TAnimal>(this TAnimal animal, IMover<int> mover) where TAnimal : Animal, IMovable<TAnimal, int>
{
animal.MoveTo(mover);
return animal;
}
}
请注意,您可以使Move
如果您需要更普遍地应用它,则扩展更通用:
public static TEntity Move<TEntity, T>(this TEntity entity, IMover<T> mover) where TEntity : IMovable<TEntity, T> where T : struct
{
entity.MoveTo(mover);
return entity;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)