2014-12-02 135 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>; 
}