Как я могу использовать тип с общими аргументами в качестве ограничения? - PullRequest
2 голосов
/ 29 сентября 2008

Я хотел бы указать ограничение другого типа с универсальным аргументом.

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 ]

2 голосов
/ 29 сентября 2008

Читайте об этом из блога Эрика Липперта По сути, вы должны найти способ обратиться к нужному типу без указания параметра вторичного типа.

В своем посте он показывает этот пример в качестве возможного решения:

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>>()

Надеюсь, это поможет, Трой

2 голосов
/ 29 сентября 2008

Поскольку TimeLine, скорее всего, представляет собой совокупность ключевых кадров, это не будет похоже на

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

хорошо выполнить ваши требования?

0 голосов
/ 30 июня 2010

Возможно, вложенность Timeline внутрь KeyFrame будет иметь смысл в вашем дизайне:

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

  class Timeline<U> where U : Keyframe<T> { 
  } 
} 
0 голосов
/ 29 сентября 2008

Если тип 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>.

...