允许列表中所有类型的泛型类型

本文关键字:类型 泛型类型 许列表 列表 | 更新日期: 2023-09-27 17:57:06

我在泛型方面遇到了一些问题。我有一个名为 Animation 的基类,不同类型的动画从中派生(例如 double、vector 等),为了处理所有动画,我使用静态类来管理所有动画。

public class Animation<T>
{
    public virtual Action<T> UpdateAction { get; set; }
    public EasingFunctionBase EasingFunction { get; set; }
    private TimeSpan _Duration = TimeSpan.FromMilliseconds(0);
    public TimeSpan Duration { get; set; }

    public T currentValue { get; internal set; }

    internal TimeSpan CurrentTime = TimeSpan.FromMilliseconds(0);
    internal double Percentage = 0;
    internal bool HasFinished = false;
    internal virtual void Update()
    {
        UpdateAction?.Invoke(CurrentValue);
    }

    public virtual void BeginAnimation()
    {
        if (Duration.TotalMilliseconds <= 0)
            throw new InvalidOperationException("You need a duration greater than 0 seconds.");
        AnimationFactory.BeginAnimation(this);
    }
}
DoubleAnimation : Animation<double>
{
    *do some calculations and set currentValue*
}
public static class AnimationFactory
{
    private static List<Animation> _CurrentAnimations = new List<Animation>();
    public static void BeginAnimation<T>(Animation<T> animation)
    {
        // Here is where I'm getting the error. I want this list to be able to contain all types of Animation<T>.
        _CurrentAnimations.Add(animation);
        _isEnabled = true;
    }
    void Update()
    {
        for(int i = 0; i < _CurrentAnimations.Count; i++)
        {
            _CurrentAnimations[i].update();
        }
    }
}

如您所见,我收到一个错误,我想将新创建和待运行的动画添加到列表中。如何使此列表接受各种Animation<T>?还是我做错了?我添加了泛型类型以删除强制转换(如果动画结构),但也许有一个更智能的解决方案。

允许列表中所有类型的泛型类型

如何使此列表接受所有类型的动画?

除非AnimationAnimation<T>的基类,否则你不能。什么是Animation?它与Animation<T>有什么关系?根据您的其他信息,您似乎实际上还没有Animation类。

一种替代方法是使静态类也泛型,例如 AnimationFactory<T> .那么列表将是List<Animation<T>>.但是,您将为每个类型参数T都有一个不同的列表,这似乎不是您要查找的。

根据到目前为止的信息,我会说你应该Animation<T>继承Animation或其他一些适当的基类(使用该基类作为List<T>的类型参数)。在这个特定示例中,这需要创建Animation基类,因为这实际上还不存在。

除此之外,您的问题可能是XY问题。 也就是说,你问了我们错误的问题,真的应该专注于你真正想要解决的更广泛的问题,而不是列表的具体细节方面。