2008-09-29 67 views
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>, 
{ 
} 
+0

你使用的是什麼版本的C#...永遠不會看到時間軸其中T:關鍵幀<*> m Ÿ生活 – 2008-09-29 18:05:05

+0

時間軸是一類我自己的:) – Trap 2008-09-29 18:07:05

+0

我想的願望將有類似於從C++模板,模板類',所以 類時間軸> { } 強制使用的關鍵幀的任何專業化作爲時間軸的約束條件 – workmad3 2008-09-29 18:10:50

回答

2

Eric Lippert's blog瞭解詳情 基本上,您必須找到一種方法來引用所需的類型,而不指定輔助類型參數。

在他的崗位,他表示這個例子作爲一個可能的解決方案:

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

的類型,不會是這樣的:

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

很好地滿足你的要求?

0

如果Timeline<T>代表類型T相同KeyFrame<T>代表你可以用走類型:

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

    ... 
} 

如果T類型代表的類之間不同的東西,意味着Timeline<T>可以包含多種類型的在這種情況下,您應該創建一個更抽象的KeyFrame實現,並在Timeline<T>中使用該實現。

0

也許築巢TimelineKeyFrame將使意義,在您的設計:

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

    class Timeline<U> where U : Keyframe<T> { 
    } 
} 
相關問題