继承和泛型c#

时间:2017-05-30 20:08:54

标签: c# generics inheritance

我有以下抽象类:

=~

和2个子类:

public abstract class PinkBoxMasksDataAbstract
{
    public string PinkBoxText { get; set; }
}

然后我有另一个类,它有PinkBoxMasksDataAbstract类作为参数:

public class PinkBoxMasksDataNoOverlay : PinkBoxMasksDataAbstract
{
}

public class PinkBoxMasksDataOverlay : PinkBoxMasksDataAbstract
{
    public int PinkBoxLeft { get; set; }
    public int PinkBoxBoxTop { get; set; }
    public int PinkBoxHeight { get; set; }
    public int PinkBoxWidth { get; set; }
}

现在我想以这种方式创建这个类:

public class ZonalMatchResult<T> where T : PinkBoxMasksDataAbstract
{
    public decimal Confidence { get; set; }
    public int GreenBoxLeft { get; set; }
    public int GreenBoxTop { get; set; }
    public int GreenBoxHeight { get; set; }
    public int GreenBoxWidth { get; set; }

    public List<T> PinkBoxMasksData { get; set; }
}

public class ZonalResult<T> where T : PinkBoxMasksDataAbstract
{
    public int ExitCode { get; set; }
    public string ErrorMessage { get; set; }
    public int NumberOfGreenBoxMatches { get; set; }
    public int NumberOfPinkBoxExtractFrames { get; set; }
    public int ProcessingTime { get; set; }
    public bool HasOverlay { get; set; }

    public List<ZonalMatchResult<T>> MatchResults { get; set; }
}

但是我收到了错误:

  

无法隐式转换类型    ZonalResult<PinkBoxMasksDataAbstract> zonalResult; if (isOverlayRequired) zonalResult = new ZonalResult<PinkBoxMasksDataOverlay>(); else zonalResult = new ZonalResult<PinkBoxMasksDataNoOverlay>(); 来   'Domain.ZonalResult<Domain.PinkBoxMasksDataOverlay>'

如果PinkBoxMasksDataOverlay是PinkBoxMasksDataAbstract的子类,为什么会发生这种情况?怎么解决?

1 个答案:

答案 0 :(得分:1)

ZonalMatchResult不会从PinkBoxMasksDataAbstract继承,只会从其类型参数继承。这就是原因,你得到这个错误。

您可以通过这种方式特定地设置数据(当然,在这种情况下它可能不是抽象的):

ZonalMatchResult<PinkBoxMasksDataAbstract> r = new ZonalMatchResult<PinkBoxMasksDataAbstract>;
if (isOverlayRequired)
    r.PinkBoxMasksData = new PinkBoxMasksDataOverlay();
else
    r.PinkBoxMasksData = new PinkBoxMasksDataNoOverlay();

但是,为什么不简单的PinkBoxMasksData类具有Overlay属性。如果此属性为null,则表示没有叠加。

public class Overlay
{
    public int PinkBoxLeft { get; set; }
    public int PinkBoxBoxTop { get; set; }
    public int PinkBoxHeight { get; set; }
    public int PinkBoxWidth { get; set; }
}

public class Mask
{
    public string PinkBoxText { get; set; }
    public Overlay Overlay { get; set; }
}


var mask = new Mask();
if (isOverlayRequired)
{
    mask.Overlay = new Overlay();
}

对于Interfaces,还有covariance选项,但这对于类来说是不可能的。所以不,我不认为有办法。