继承和通用类型

时间:2014-12-02 16:39:52

标签: c#

我有一个问题是创建我的代码结构我现在不知道如何让它工作

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
{
}

2 个答案:

答案 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>;
}