Ist es schlecht, auf einen abgeleiteten Typ in einem Basistyp zu verweisen?

8

Ich habe eine Kategorie / Dateibaumstruktur. Beide Kategorien und Dateien können Eltern haben, daher habe ich sie aus einer gemeinsamen Basisklasse mit einer Parent-Eigenschaft abgeleitet. Da alle Eltern offensichtlich immer Kategorien sind (Dateien können keine Eltern sein), scheint es sinnvoll zu sein, die Parent-Eigenschaft des Knotens zum CategoryNode-Typ zu machen.

Ist es für die Basisklasse schlecht, auf die abgeleitete Klasse zu verweisen? Wenn ja warum? Was ist eine bessere Möglichkeit, dies zu strukturieren, wenn ja?

%Vor%     
Kelsie 03.07.2012, 07:29
quelle

4 Antworten

4

Wenn die Eigenschaft Parent eigentlich eine gemeinsame Eigenschaft aller Nachkommen ist und immer vom Typ CategoryNode ist, ist das kein Problem. Semantisch gesehen ist es korrekt und technisch denke ich, dass es auch korrekt ist, sobald Sie in derselben Bibliothek bleiben (um zirkuläre Referenzen zu vermeiden).

Dies kann ein Problem sein, wenn Sie Code wie folgt schreiben:

%Vor%

Dieser Code ist schlecht, weil Sie den Vorteil der Vererbung verlieren.

Auch im .NET Framework gibt es solche Konstrukte . Das erste Beispiel, das mir in den Sinn kommt, ist das XObject.Parent Eigenschaft.

XElement erbt XObject und XObject veröffentlicht eine Eigenschaft des Typs XElement. Genau wie Ihr Schnipsel.

    
Steve B 03.07.2012, 07:36
quelle
7

Sie könnten ...

machen %Vor%

Auf diese Weise müssen Sie nicht auf ein abgeleitetes Objekt in der Basisklasse verweisen, und Sie sind flexibler in dem, was tatsächlich zu einem Elternteil werden kann, falls Sie zu einem späteren Zeitpunkt weitere Objekttypen erhalten . Außerdem kann jede Funktionalität, die nur für einen Elternteil relevant ist, in dieser Schnittstelle deklariert werden.

    
takrl 03.07.2012 07:40
quelle
1

Die Basisklasse sollte nicht wissen, wer davon abgeleitet wird.

Wenn Sie einen solchen Fall haben, wollen Sie wahrscheinlich keine Vererbung. Sie sollten nur eine Form der Kopplung verwenden.

Die Datei und der CategoryNode sollten in Ihrem Fall ein Knotenelement enthalten.

    
Yochai Timmer 03.07.2012 07:36
quelle
1

Andere Optionen bestehen darin, die Klassenhierarchie zu ändern, um den CategoryNode zu einer Stammklasse (a) zu machen, oder den Eigenschaftstyp in Node (b) zu ändern.

Beide Möglichkeiten sind nicht gut: (a) Die Datei hat alle Funktionen, die CategoryNode hat, die sie nicht benötigt. (b) Es wird den Objekttyp (der immer CategoryNode ist) ausblenden. Dies kann zu ungültigen Besetzungsfehlern an anderer Stelle in Ihrem Code führen. Zum Beispiel, wenn Sie vergessen, gibt es immer eine CategoryNode-Instanz.

In Anbetracht dessen glaube ich, dass der aktuelle Code in Ordnung ist.

    
Ivan Nikitin 03.07.2012 07:38
quelle

Tags und Links