2013-07-22 25 views
2

我有兩個抽象類型具有多對多的關係:爲什麼我不能將這個泛型類型的實例添加到集合中?

public abstract class Experiment<T> where T : Sample 
{ 
    private List<T> _Samples = new List<T>; 
    public IReadOnlyCollection<T> Samples { 
     get { return _Samples.AsReadOnly(); } 
    } 

    public void AddSample(T sample) 
    { 
     _Samples.Add(sample); 
     sample.Experiments.Add(this); // The problem lies here 
    } 
} 

public abstract class Sample 
{ 
    private List<Experiment<Sample>> _Experiments = new List<Experiment<Sample>>; 
    public ICollection<Experiment<Sample>> Experiments { 
     get { return _Experiments; } 
    } 
} 

正如你可以看到,實驗接受一個類型參數是Sample一個子類。我想要做的是這樣的:每當Sample的子類型的實例被添加到Experiment時,Experiment應相應地被添加到SampleExperiments集合中。

當我嘗試將Experiment<T>的實例添加到List<Experiment<Sample>>的集合時,問題就出現了。由於TSample的子類型,因此我假定不存在問題。實際發生的是:

Value of type 'Experiment<T>' cannot be converted to 'Experiment<Sample>` 

我的問題是,是否有解決這個問題的方法,或者更好的模型,這些實體之間的關係。

+0

PS:我實際上使用VB,但似乎有一個更大的C#觀衆,所以我已經將我的代碼翻譯成C#。我相信這種語言不應該對解決問題的方法有所作爲,但如果我錯了,隨時糾正我。 –

+0

你能分享有效的VB代碼嗎? –

+0

@CédricBignon實際上並沒有「工作」的VB代碼,我在上面註釋過的一行(即'sample.Experiments.Add(Me)')得到了一個編譯器錯誤。我在那裏訓練語法嗎? –

回答

2

所以我認爲,解決方法是這樣的:

public abstract class Experiment<T> where T : Sample<T> 
{ 
    private List<T> _Samples; 
    public IReadOnlyCollection<T> Samples { 
     get { return _Samples.AsReadOnly(); } 
    } 

    public void AddSample(T sample) 
    { 
     _Samples.Add(sample); 
     sample.Experiments.Add(this); // The problem lies here 
    } 
} 

public abstract class Sample<T> where T : Sample<T> 
{ 
    private List<Experiment<T>> _Experiments; 
    public ICollection<Experiment<T>> Experiments { 
     get { return _Experiments; } 
    } 
} 

由於這兩種類型都依賴於對方,然後他們需要共享同一個泛型類型。

+0

'在哪T:Sample'什麼是Sample? –

+0

@HamletHakobyan,它是'Sample'派生的具體類。如果我要構建'ConcreteSample:Sample',它會滿足這個條件。此外,OP不會傳入「Sample」的實例,因爲它是抽象的。 –

+1

它需要是「公共抽象類樣本其中T:示例'。否則不會編譯。 –

2
public class Experiment<T> where T : Sample 
{ 
    private List<T> _Samples = new List<T>(); 
    public IReadOnlyCollection<T> Samples 
    { 
     get { return _Samples.AsReadOnly(); } 
    } 

    public Experiment() 
    { 
    } 

    public Experiment(IEnumerable<T> samples) 
    { 
     _Samples = samples.ToList(); 
    } 

    public void AddSample(T sample) 
    { 
     _Samples.Add(sample); 
     sample.Experiments.Add(new Experiment<Sample>(_Samples)); // The problem lies here 
    } 
} 

public abstract class Sample 
{ 
    private List<Experiment<Sample>> _Experiments = new List<Experiment<Sample>>(); 
    public ICollection<Experiment<Sample>> Experiments 
    { 
     get { return _Experiments ; } 
    } 
} 

通過添加一些構造和Sample修改Experiments收集我想我是能夠實現你在找什麼。現在你可以使用下面的代碼

public class MySample : Sample{} 

public class MyExperiment : Experiment<MySample>{} 

MyExperiment me = new MyExperiment(); 
me.AddSample(new MySample()); 
+0

這會工作,但不幸的是,我沒有提到一個實驗的實例綁定到硬件控制器類的許多其他數據和實例。簡單地重新創建一個實驗實例將會很昂貴,至少需要更多的代碼才能成功移動數據。 –

相關問題