我有一个问题是创建我的代码结构我现在不知道如何让它工作
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
{
}
答案 0 :(得分:4)
通用类型不会根据其类型参数继承。 PlayListInfo<QuranVerseTrack>
不 PlayListInfo<VerseTrack>
你可以做:
PlayListInfo<VerseTrack1> ProgresList = new PlayListInfo<VerseTrack1>();
然后将所有项视为VerseTrack
,但不清楚
或者你可以这样做:
PlayListInfo<VerseTrack> ProgresList = new PlayListInfo<VerseTrack>();
然后将VerseTrack1
(或VerseTrack2
)项添加到其中(假设它是某种类型的集合)。
附注:player1.ProgresList
隐藏基本属性,而不是覆盖它。
答案 1 :(得分: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>;
}