2010-03-13 66 views
1

是否可以做這樣的事情在C#中的以下? 基本上TParent和TChildren應該是類型A類,但 necessairly有,我知道這聽起來可能令人困惑的是通過了相同的類型,但我要強烈類型,特定對象的孩子和家長,但在同一時間它們必須是相同的類型。由於TParent繼承自A,這意味着它需要從A繼承的類型參數,但使用可能不同的類型。C#泛型問題

public class A<TParent, TChildren> 
    where TParent : A 
    where TControls : A 
{ 
    TParent Parent; 
    List<TChildren> Children; 
} 

或更容易在這裏看到:

public class A<TParent, TChildren> 
    where TParent : A<?, ?> 
    where TChildren : A<?, ?> 
{ 
    TParent Parent; 
    List<TChildren> Children; 
} 

我希望這不是太混亂。這是可能嗎?

謝謝:)

+1

您想要做什麼? – 2010-03-13 03:53:59

+0

只是爲了澄清這個問題:你想要有2個相同的*類型的泛型參數,但你不希望它們是同一個實例。 – 2010-03-13 04:16:13

+0

@邁克爾葡萄汁 - 兩個泛型參數*可能*是同一類型但它們是不同的可能性。 – TheCloudlessSky 2010-03-13 04:45:57

回答

0

不,這是不可能的。然而,一種解決方法是創建A<TParent, TChild>的子類並強制通用類型參數屬於該類型:

public interface A 
{ 
    // some properties and methods 
} 

public class A<TParent, TChild> : A where TParent : A where TChild A 
{ 
    // something else here. 
} 
2

如果你想說「父母必須有這種類型的孩子和孩子必須有這種類型的父母」,那麼,我認爲答案是否定的,你可以」 t,因爲你還需要知道父母的父母和孩子的孩子的類型。

但是,你能夠做到這一點

public interface IHasChildren<T> 
{ 
    List<T> Children { get; set; } 
} 

public interface IHasParent<T> 
{ 
    T Parent { get; set; } 
} 

public class A<TParent, TChildren> : IHasChildren<TChildren>, IHasParent<TParent> 
    where TParent : IHasChildren<A<TParent, TChildren>> 
    where TChildren : IHasParent<A<TParent, TChildren>> 
{ 
    public List<TChildren> Children { get; set; } 
    public TParent Parent { get; set; } 
} 
2

不,這是不可能的。你能來最接近的是定義另一個基本類型,並要求TParent和年擄從繼承:

public class A { } // or an interface 

public class A<TParent, TChild> : A 
    where TParent : A 
    where TChild : A 
{ } 

並不保證您TParent和年擄是通用A<,>型的,但至少不會允許你對它們施加一些約束,然後假設實現可以採取的約束。