gpt4 book ai didi

c# - 重写继承方法时避免显式类型转换

转载 作者:可可西里 更新时间:2023-11-01 08:46:42 26 4
gpt4 key购买 nike

我有一个基础抽象类,它也实现了一个特定的接口(interface)。

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
}
}

然后我继承了一些类,其中一些类必须重写基类的接口(interface)实现方法。

public class Snake : Animal
{
...

public override Animal Move(IMover<int> moverProvider)
{
// perform different movement
}
}

我的接口(interface)方法在对象实例移动后返回相同的对象实例,因此我可以使用链接 或直接在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);

问题

正如您在我的示例中看到的那样,我在子类中的覆盖返回基类类型而不是运行类。这可能需要我转换结果,我想避免这种情况。

我如何定义我的接口(interface)和实现,以便我的覆盖将返回执行实例的实际类型?

public Snake Move(IMover<int> moverProvider) {}

最佳答案

我建议将接口(interface)方法的返回类型更改为 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;
}

关于c# - 重写继承方法时避免显式类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23911008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com