2017-05-30 168 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屬性 –