2017-05-30 126 views
1

我有以下抽象类:继承和泛型C#

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

和2子类:

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

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

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>(); 

,但我得到一个错误:

Cannot implicitly convert type 'Domain.ZonalResult<Domain.PinkBoxMasksDataOverlay>' to 'Domain.ZonalResult<Domain.PinkBoxMasksDataAbstract>'

为什么会发生,如果PinkBoxMasksDataOverlay是PinkBoxMasksDataAbstract的子类?怎么修?

+0

创建一个不是泛型的'ZonalMatchResultBase'类,并从中继承'ZonalMatchResult ',然后可以使用基类型来存储任何泛型实例。 – Gusman

+0

'ZonalMatchResult ''和'ZonalMatchResult '除了'object'之外没有公共基类。类型参数的继承关系在这里没有任何影响;如果他们不同,他们是不同的。 –

+0

@古斯曼,我有一个很深的孩子班。真的ZonalMatchResult只是嵌套类的链 –

回答

1

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

你可以specificaly设置数据这种方式(当然,它可能不会在这种情况下,抽象):

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

但是,为什么不能简单有PinkBoxMasksData类具有Overlay属性。如果此属性为空,那么您没有覆盖。

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(); 
} 

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

+0

的问题是生成json文件。它创建嵌套结构等: “PinkBoxText”: “75条评论\ r \ n” 个, “PinkBoxCoordinates”:{ “PinkBoxLeft”:179, “PinkBoxBoxTop”:532, “PinkBoxHeight”:20, “PinkBoxWidth” :65 },但我需要没有PinkBoxCoordinates属性 –