Grüße. Ich habe die folgende Klasse:
%Vor%Ich möchte diese Klasse wie folgt erben:
%Vor%das macht Sinn.
Was ich gerne wissen möchte ist, wie entferne ich bestimmte Funktionen der Basisklasse?
zum Beispiel:
%Vor%Ich möchte es sein:
%Vor%meine Frage ist, wie implementiere ich den Code, der die Basisklasse shipUnit vollständig verbirgt?
andernfalls werde ich mit der shipUnit-Implementierung in der abgeleiteten Klasse enden.
Danke für Ihre Zeit.
ShipPlacementArray behandelt nur ein Schiff. aber das Array spiegelt die Richtungen wider, in die das Schiff platziert werden kann.
Nach meiner Erfahrung war jedes Mal, wenn ich eine Eigenschaft aus einer Klasse in einer geerbten Klasse entfernen wollte, mein Klassendesign fehlerhaft. Eine Möglichkeit zur Lösung dieses Problems besteht darin, eine neue Basisklasse ohne die ShipUnit-Eigenschaft zu erstellen und diese Basisklasse dann zweimal zu übernehmen, einmal für Ihren konkreten Schiffstyp und einmal für Ihren konkreten ShipPlacementArray-Typ. In beiden Unterklassen können Sie ShipUnit nach Bedarf implementieren.
Was ich gerne wissen möchte ist, wie entferne ich bestimmte Funktionen der Basisklasse?
Sie nicht. Dies ist nicht der Punkt der Vererbung. Der Vererbungspunkt besteht darin, die Basisklassenfunktionalität zu übernehmen - all - und Dinge hinzuzufügen / zu ändern. Es ist für "ist-a" Beziehungen, z. B. "ein Auto ist ein Fahrzeug."
meine Frage ist, wie implementiere ich den Code, der die Basisklasse shipUnit vollständig verbirgt?
Es klingt, als ob ShipPlacementArray
ein Wrapper oder Container von mehreren Ship
-Objekten sein soll. Dies scheint kein Fall zu sein, in dem Vererbung verwendet werden sollte.
Stellen Sie sich die Frage: "Ist ein ShipPlacementArray
eine Art Ship
?"
Sie können nicht bewirken, dass Elemente einer Basisklasse in einer abgeleiteten Klasse verschwinden. In bestimmten Fällen können Sie die Basiselemente maskieren oder ausblenden Wenn Sie das Schlüsselwort new
für Ihr ausgeblendetes Element in der abgeleiteten Klasse verwenden, kann der Benutzer das Objekt immer wieder in die Basisklasse (base)instance_of_derived
zurückversetzen und auf die Mitglieder der Basisklasse zugreifen.
Sie können das beispielsweise in Ihrer abgeleiteten Klasse tun:
%Vor%Aber dann kann ich tun:
%Vor%Und dies wird auf die ursprüngliche shipUnit verweisen. So können Sie das Mitglied "verstecken", aber Sie können seine Funktionalität oder Zugänglichkeit nicht deaktivieren.
Zusätzlich zu den anderen ausgezeichneten Antworten würde ich als Nebenbemerkung sagen, dass Sie die Kapselung als eine bessere Option finden. Oft dachte ich zuerst, dass ich von einer Klasse erben wollte, und stellte später fest, dass ich es wirklich einkapseln wollte. Sie tun dies, indem Sie einfach eine neue Instanz der ursprünglichen Klasse in einem privaten Feld deklarieren. Sie erstellen dann öffentliche Eigenschaften und Funktionen, die einfach die ursprüngliche Klasse wie die folgende aufrufen, und geben Ihnen damit eine feine Kontrolle darüber, was ausgesetzt wird. Dies ist auch eine Möglichkeit, die Nachteile der Vererbung wie die hinzugefügte Komplexität und die Unfähigkeit, mehrfache Vererbung durchzuführen (aus gutem Grund) zu umgehen:
%Vor%Ich weiß nicht, ob das nur ein erfundenes oder ein tatsächliches Problem ist. Aber ich würde sagen, dass die Erbschaft in diesem Fall nicht erwünscht ist. Sie haben Ship und ShipPlacementArray. Das "Array" am Ende klingt eher nach seinem Array-Datentyp. Also, wenn du das wegnimmst, hast du ShipPlacement.
Das klingt für mich wie ein Ort irgendwo, also sollte es vielleicht ein Mitglied der Schiffsklasse sein?
"Objektzusammensetzung über Klassenvererbung favorisieren" - Wenn Sie nach einem neuen Verhalten aus der Basisklasse suchen, scheint es nicht so, als würden Sie es trotzdem übernehmen wollen, da sie unterschiedliche Typen sind. Vielleicht sollten Ship und ShipPlacementArray eine gemeinsame Schnittstelle erben, aber sicher nicht von einer gemeinsamen Basisklasse. Irgendwo, den Sie verwenden müssten, könnten Sie die Schnittstelle verwenden - aber wo Sie Ihre ShipUnit-Matrix benötigen, würden Sie den ShipPlacementArray-Typ explizit verwenden.
Ich verstehe nicht ganz, was Sie mit der Vererbung modellieren wollen, aber ich bin mir ziemlich sicher, dass es das falsche Werkzeug ist. Ich nehme an, Aggregation oder Komposition sind was Sie brauchen.
Sie können das neue Schlüsselwort verwenden oder in der Deklaration für die Basisklasse virtuell hinzufügen und es für die abgeleitete Klasse überschreiben.
Tags und Links class c# inheritance base