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% 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.
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.
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.
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.
Tags und Links c# inheritance oop