2014-12-02 136 views
0

我有一個問題要創建我的代碼結構,現在我不如何使它工作繼承和泛型類型

問題在PlayListInfo<VerseTrack> ProgresList = new PlayListInfo<VerseTrack1>(); 它被粗野,轉換

這裏是代碼樣本

public class PlayListInfo<_VerseTrack> : IPlayListInfo 
    where _VerseTrack : VerseTrack 
{ 
    public List<_VerseTrack> Tracks; 
} 

public class VerseTrack1: VerseTrack 
{ 

} 

public class VerseTrack2: VerseTrack 
{ 

} 


public class player 
{ 
    PlayListInfo<VerseTrack> ProgresList; 
} 

public class player1:player 
{ 
    PlayListInfo<VerseTrack> ProgresList = new PlayListInfo<VerseTrack1>(); 
} 
public class player2:player 
{ 
} 
+1

這應有助於:http://stackoverflow.com/questions/2033912/c-sharp-variance-problem-assigning-listderived-as-listbase – JYL 2014-12-02 16:43:14

+0

我編輯的問題並糾正它,它的「VerseTrack1」 – 2014-12-02 16:43:15

回答

4

泛型類型不是基於類型參數繼承的。一個PlayListInfo<QuranVerseTrack>一個PlayListInfo<VerseTrack>

可能做:

PlayListInfo<VerseTrack1> ProgresList = new PlayListInfo<VerseTrack1>(); 

,然後把所有的項目VerseTrack的,但目前還不清楚,如果這就是你應該做什麼。

,或者你可以這樣做:

PlayListInfo<VerseTrack> ProgresList = new PlayListInfo<VerseTrack>(); 

,然後添加VerseTrack1(或VerseTrack2)項目(假定這是某種形式的集合)。

附註:player1.ProgresList隱藏基本屬性,而不是覆蓋它。

+0

同意,並且他已經擁有的類型限制足以滿足他試圖設置的限制。 – Paul 2014-12-02 16:45:28

1

如果您使用的是.NET 4.0或更高版本,下面是另一種解決方法。我給你介紹covariance and contravariance

Assuming A is convertible(implicit reference conversion is available) to B, 
X is covariant if X<A> is convertible to X<B> 

自協方差和逆變只與接口工作,你需要修改IPlayListInfo這樣的:

public interface IPlayListInfo<out _VerseTrack> 
    where _VerseTrack : VerseTrack 
{ 
    // blah blah ... 
} 

而這可能會奏效!

public class player1:player 
{ 
    // PlayListInfo<VerseTrack> ProgresList = new PlayListInfo<VerseTrack1>(); // old one 
    IPlayListInfo<VerseTrack> ProgressList = new PlayListInfo<VerseTrack1>() as IPlayListInfo<VerseTrack1>; 
}