2016-07-15 8 views
1

ジェネリックに問題があります。アニメーションと呼ばれる基本クラスがあります。異なるタイプのアニメーション(例えば、倍精度、ベクトルなど)から派生し、すべてのアニメーションを処理するために静的クラスを使用して基本的にすべてのアニメーションを管理します。リスト内のすべてのタイプのジェネリックタイプを許可する

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

あなたは 'Animation'クラスのコードを提供できますか? – dotnetom

+0

@dotnetomちょっと! – Tokfrans

+0

'Animation 'ではなく、 'Animation'クラスがありますか? – dotnetom

答えて

2

どのようにしてこのリストにすべての種類のアニメーションを受け入れることができますか?

AnimationAnimation<T>の基本クラスでない限り、できません。 Animationとは何ですか? Animation<T>との関係は何ですか?あなたの追加情報に基づいて、実際にはAnimationクラスを持っていないようです。

静的なクラスを一般的なものにすることもできます。 AnimationFactory<T>。リストはList<Animation<T>>となります。しかし、タイプパラメータTにはそれぞれ異なるリストがありますが、探しているようには見えません。

これまでの情報に基づいて、Animation<T>Animationまたはその他の適切な基本クラス(その基本クラスをList<T>の型パラメータとして使用)を継承する必要があります。この特定の例では、それは実際にはまだ存在しないので、Animationベースクラスを作成する必要があります。

これを禁止すると、ご質問はXY Problemとなる場合があります。私。あなたは私たちに間違った質問をしてきました。実際には、リストのナットとボルトの面ではなく、実際に解決しようとしているより広い問題に焦点を当てるべきです。

+0

私はちょうどアニメーションから派生するクラスのアニメーションを作った。これはすばらしいことですが、はい、おそらく正しいでしょう - これはXYの問題です。 – Tokfrans

関連する問題