2017-05-30 7 views
1

Ich habe folgende abstrakte Klasse:Vererbung und Generika C#

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

und 2 Unterklassen:

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

dann habe ich eine andere Klasse, die PinkBoxMasksDataAbstract Klasse als Parameter hat:

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

jetzt möchte ich diese Klasse auf diese Weise erstellen:

  ZonalResult<PinkBoxMasksDataAbstract> zonalResult; 
      if (isOverlayRequired) 
       zonalResult = new ZonalResult<PinkBoxMasksDataOverlay>(); 
      else 
       zonalResult = new ZonalResult<PinkBoxMasksDataNoOverlay>(); 

aber ich erhalte eine Fehlermeldung:

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

Warum es passiert, wenn PinkBoxMasksDataOverlay Unterklasse von PinkBoxMasksDataAbstract ist? Wie repariert man?

+0

Erstellen Sie eine 'ZonalMatchResultBase' Klasse nicht generisch und erben' ZonalMatchResult 'von dieser, dann können Sie den Basistyp verwenden, um eine generische Instanz zu speichern. – Gusman

+0

'ZonalMatchResult ' und 'ZonalMatchResult ' haben keine gemeinsame Basisklasse außer 'object'. Die Vererbungsbeziehung der Typparameter hat hier keine Bedeutung; Wenn sie anders sind, sind sie anders. –

+0

@Gusman, ich habe ein tiefes Kind Klassen. Wirklich ZonalMatchResult ist nur Kette von verschachtelten Klassen –

Antwort

1

ZonalMatchResult erbt nicht von PinkBoxMasksDataAbstract, nur seine Art Parameter tut. Aus diesem Grund erhalten Sie diesen Fehler.

Sie specificaly die Daten auf diese Weise einstellen könnte (natürlich ist es in diesem Fall nicht abstrakt sein kann):

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

Doch warum nicht einfach haben PinkBoxMasksData Klasse, die eine Overlay Eigenschaft hat. Wenn diese Eigenschaft null ist, haben Sie kein 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(); 
} 

Für Schnittstellen gibt es auch die Möglichkeit, covariance, aber dies ist für die Klassen nicht möglich. Also nein, ich denke nicht, dass es einen Weg gibt.

+0

Problem ist, JSON-Datei zu generieren. Es schafft verschachtelte Struktur wie: "PinkBoxText": "75 Bewertungen \ r \ n", "PinkBoxCoordinates": { "PinkBoxLeft": 179, "PinkBoxBoxTop": 532, "PinkBoxHeight": 20, "PinkBoxWidth" : 65 }, aber ich brauche ohne PinkBoxCoordinates Eigenschaft –