C # Klassenvererbung

7

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.

    
iTEgg 22.02.2010, 14:47
quelle

11 Antworten

7

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.

    
Jeremy Wiebe 22.02.2010, 14:53
quelle
15
  

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 ?"

    
Thomas 22.02.2010 14:50
quelle
2

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.

    
David Pfeffer 22.02.2010 14:49
quelle
2

Mit dem Modifikator new von C # können Sie ein geerbtes Mitglied von einem Basisklassenmitglied ausblenden. Hier finden Sie diese Seite zur Referenz.

    
Pompair 22.02.2010 14:51
quelle
1

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%     
AaronLS 22.02.2010 14:56
quelle
1

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?

    
Bryce Fischer 22.02.2010 17:18
quelle
1

"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.

    
WalterVonBruegemon 23.02.2010 03:31
quelle
0

Sie können den Operator "new" verwenden. wie in

%Vor%     
aggietech 22.02.2010 14:49
quelle
0

Sie können das Schlüsselwort new wie folgt verwenden:

%Vor%     
Max Toro 22.02.2010 14:50
quelle
0

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.

    
Daniel Brückner 22.02.2010 14:55
quelle
0

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.

    
Jojo Sardez 23.02.2010 09:19
quelle

Tags und Links