2008-09-29 2 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<T> 
{ 
private IList<KeyFrame<T>> keyFrameList; 
... 
} 

이에 대한 우아한 해결책이 아니라 타임 라인이 가장 가능성이 키 프레임의 집합이므로 것없는 무언가 같이, 키 프레임 인수?

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

C#의 어떤 버전을 사용하고 있습니까 ... 타임 라인이 표시되지 않습니다 T : 키 프레임 <*>/m Y 수명 –

+0

타임 라인이 너무 수준의 타임 라인 > { } 가의 사용을 강제하기 위해, 내 자신의 클래스 : – Trap

+0

나는 욕망 C++에서 '템플릿 템플릿 클래스'와 유사한 가지고있을 거라고 생각입니다 타임 라인의 제약 조건으로 Keyframe의 모든 특성화 – workmad3

답변

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

희망 도움이 트로이

+0

독서를 가져 주셔서 감사합니다. FooBase 방식은 꽤 우아하고 결코 생각하지 못했습니다. :) – Trap

2

의 유형을 지정하는 것보다 거기 귀하의 요구 사항을 충족 시키십시오. 타입 T가 Timeline<T>는 여러 유형을 포함 할 수 있음을 의미하는 클래스 사이에 뭔가 다른 것을 나타내는 경우

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

    ... 
} 

: Timeline<T>가 나타내는 유형 (T)가 KeyFrame<T> 방금 ​​함께 갈 수 나타내는 유형과 동일한 경우

+0

적어도 소비자를 너무 가볍게 다루지 않기 위해 IList (또는 비슷한 인터페이스)를 사용하지 않겠습니까? –

+0

일부 쓸모없는 코드를 작성하고 C#이 가장 익숙한 언어가 아닙니다. 가능성은 IList가 더 좋을 것이라는 점입니다. – workmad3

+0

예, 정확히 처음 구현되었지만 당신이 말한대로 제 요구 사항을 충족시키지 못했습니다. 감사합니다 :) – Trap

0

KeyFrame의 경우 KeyFrame의 더 추상적 인 구현을 만들고 Timeline<T>에서 사용해야합니다.

0

어쩌면 당신의 디자인 감각을 만들 것 KeyFrame 내부 Timeline을 중첩 :

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

    class Timeline<U> where U : Keyframe<T> { 
    } 
} 
관련 문제