继承和泛型类型
问题描述:
我有一个问题要创建我的代码结构,现在我不如何使它工作继承和泛型类型
问题在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
{
}
答
泛型类型不是基于类型参数继承的。一个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
答
如果您使用的是.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>;
}
这应有助于:http://*.com/questions/2033912/c-sharp-variance-problem-assigning-listderived-as-listbase – JYL 2014-12-02 16:43:14
我编辑的问题并纠正它,它的“VerseTrack1” – 2014-12-02 16:43:15