У меня есть базовый абстрактный класс, который также реализует конкретный интерфейс.
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
}
}
Мои методы интерфейса возвращают один и тот же экземпляр объекта после его перемещения, поэтому я могу использовать цепочку или делать что-то непосредственно в инструкции 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) {}