我在使用泛型方面遇到了一些问题。我有一个名为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>
的各种?或者我错了吗?我添加了泛型类型以删除强制转换(如果是动画结构),但也许这是一个更智能的解决方案。
答案 0 :(得分:2)
如何让这个列表接受各种动画?
除非Animation
是Animation<T>
的基类,否则你不能。 什么是的关系是什么?根据您的其他信息,您似乎还没有Animation
?它与Animation<T>
Animation
课程。
一种替代方案是使静态类也是通用的,例如AnimationFactory<T>
。然后列表将是List<Animation<T>>
。但是,对于每个类型参数T
,您会有一个不同的列表,这看起来不像您正在寻找的那样。
根据目前为止的信息,我会说你应该Animation<T>
继承Animation
或其他一些合适的基类(使用该基类作为List<T>
的类型参数) 。在这个特定的例子中,这将需要创建Animation
基类,因为它实际上并不存在。
除此之外,您的问题可能是XY Problem。即你问过我们错误的问题,而且应该把重点放在你真正试图解决的更广泛的问题上,而不是列表中的细节方面。