2009-03-09 2 views
2

가장 단순한 방식으로 작동해야한다는 생각에 다소 문제가 있습니다.BindingList BindingList 오버로드 중 하위 속성이 T 상위 클래스 인

BindingList<subclasss T> 인 하위 클래스에서 유형 BindingList<T>의 속성을 오버로드하려고합니다. 이 문제를 해결할 수있는 방법이 있지만 '직접적인 방법없이'가장 좋은 방법이 될 것 같습니다. 여러 가지 옵션을 시도해 보았지만 몇 가지 해결책이 있지만 그 중 어떤 것도 특히 만족스럽지 않습니다.

가장 좋은 방법이 있습니까? A 간단 코드 예제는 최상의 설명 자일 수 있습니다. 아래의 예제에서, 사과 만 포함하고 동일한 사과 이름을 사용하여 Apple의 BindingList<>에 액세스하려면 fruitbowl을 파생시키고 싶습니다 (하위 클래스의 경우 일반 과일 in Super 클래스의 경우).

-------- 예 -------

class Fruit{} 
class Apple: Fruit {} 

class FruitBowl 
{ 
    protected BindingList<Fruit> m_aFruits; 

    public BindingList<Fruit> Fruits 
    { 
    get {return m_aFruits;} 
    } 
} 

class AppleBowl : FruitBowl 
{ 
    public BindingList<Apple> Fruits 
    { 
    get {return m_aFruits;} 
    } 
} 

답변

1
class FruitBowl<T> where T : Fruit //this requires T to inherit from Fruit 
{ 
    protected BindingList<T> Fruits; 
} 

class AppleBowl : FruitBowl<Apple> 
{ 
    //AppleBowl will have an inherited property Fruits 
    //of type BindingList<Apple> 
} 
+0

일 - 또한, 구타는 "여기서 T : 과일"더 많은 유형의 안전에 대한 FruitBowl 에 제약. –

+0

@Matt가 주석을 추가 할 때 @Matt가 타이프했습니다. –

2

당신이 공동/콘트라 차이로 알려져있다 할 시도하고 있습니다. 불행히도 C#의 구체적인 유형에서는 지원되지 않습니다 (C# 4.0 인터페이스에서만 사용 가능). BindingList <T>의 구현을 감안할 때 원하는 것을 수행하고 단일 목록 만 유지할 수는 없습니다.

여러 가지 방법으로 위조를 시도 할 수 있습니다. 이 문제를 해결하는 한 가지 방법은 서브 클래스에 IEnumerable <T>을 사용하는 것입니다. 이 경우 간단한 LINQ 쿼리가 트릭을 수행합니다.

class AppleBowl : FruitBowl 
{ 
    public IEnumerableApple> TypedFruits 
    { 
    get {return base.Fruits.Cast<Apple>();} 
    } 
} 
+0

그의 예는 약간 모호합니다. 그러나 나는 그가 여기에 공분산을 시도하는 것이 반드시 필요하다고 생각하지 않습니다. 그는 AppleBowl * instance *에 사과 만 보유하기를 원하기 때문에 유형 변경이 필요하지 않습니다. –

+0

@Rex 그가 찾고있는 것이 정확하지 않을 수도 있지만 그의 목표를 달성하기 위해서는 그가 필요로 할 것입니다. 그가 두 가지 일반적인 인자를 가진 같은 구체적인 클래스를 반환하기를 원한다면 타입 변경이 필요하다. – JaredPar

관련 문제