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

由于 TimeLine 很可能是关键帧的聚合,因此不会像:

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

很好地满足您的要求?

于 2008-09-29T18:12:28.037 回答
2

Eric Lippert 的博客中了解这一点 基本上,您必须找到一种方法来引用您想要的类型,而无需指定辅助类型参数。

在他的帖子中,他将这个例子展示为一个可能的解决方案:

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 回答
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 回答
0

也许嵌套TimelineKeyFrame您的设计中会有意义:

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

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