2

ジェネリック引数を持つ別の型の制約を指定したいと思います。

class KeyFrame<T>
{
    public float Time;
    public T Value;
}

// I want any kind of Keyframe to be accepted
class Timeline<T> where T : Keyframe<*>
{
}

しかし、これはまだ c# で行うことはできません (そして、そうなることはないと思います)。キーフレーム引数のタイプを指定するのではなく、これに対するエレガントな解決策はありますか?:

class Timeline<TKeyframe, TKeyframeValue> 
     where TKeyframe : Keyframe<TKeyframeValue>,
{
}
4

4 に答える 4

2

これについては、Eric Lippert のブログ を参照してください。基本的には、2 次型パラメーターを指定せずに必要な型を参照する方法を見つける必要があります。

彼の投稿では、この例を可能な解決策として示しています。

public abstract class FooBase
{
  private FooBase() {} // Not inheritable by anyone else
  public class Foo<U> : FooBase {...generic stuff ...}

  ... nongeneric stuff ...
}

public class Bar<T> where T: FooBase { ... }
...
new Bar<FooBase.Foo<string>>()

お役に立てば幸いです、トロイ

于 2008-09-29T18:57:59.860 に答える
2

TimeLine は KeyFrames の集約である可能性が最も高いため、次のようなものではありません。

class TimeLine<T>
{
private IList<KeyFrame<T>> keyFrameList;
...
}

あなたの要件をうまく満たしていますか?

于 2008-09-29T18:12:28.037 に答える
0

Timeline内部に入れ子にKeyFrameすることは、あなたのデザインでは理にかなっているかもしれません:

class KeyFrame<T> { 
  public float Time; 
  public T Value; 

  class Timeline<U> where U : Keyframe<T> { 
  } 
} 
于 2010-06-30T19:55:30.633 に答える
0

表す型 T がTimeline<T>表す型と同じ場合は、次のKeyFrame<T>ようにします。

class Timeline<T>
{
  List<KeyFrame<T>> _frames = new List<KeyFrame<T>>(); //Or whatever...

  ...
}

タイプ T がクラス間で異なる何かを表している場合Timeline<T>、複数のタイプの を含むことができることを意味しKeyFrameます。この場合、 のより抽象的な実装を作成してKeyFrame使用する必要がありますTimeline<T>

于 2008-09-29T18:23:06.653 に答える