.NET-Vererbung: Unterdrückt eine Eigenschaft aus der Basisklasse

8

Betrachten Sie die Klassen Employee, Manager und Assistant:

%Vor%

Das Ziel besteht darin, einen Codeabschnitt zu deaktivieren, um auf eine Eigenschaft wie diese zuzugreifen:

%Vor%

Weil Manager von Emp erbt, hat es eine Eigenschaft .Manager und .Assistant .

Frage

Gibt es Modifikatoren in der .NET-Vererbungsimplementierung, um die Eigenschaften .Manager und .Assistant zu entfernen?

Aktualisieren

Danke für Ihre großartigen Antworten, alle. Ich hatte gehofft, dass die Vereinfachung und die Einrichtung von Emp / Mgr in dieser Frage durchschauen würde. Es ist klar, dass die Vererbung in diesem Beispiel zu einer anderen Gemeinsamkeit genommen werden sollte (etwas wie Person , wo die Klassen Namen, Geburtsdaten usw. teilen würden). Ihre Eingabe wird sehr geschätzt!

    
p.campbell 19.01.2010, 22:30
quelle

6 Antworten

9

Dies würde das Liskow-Substitutionsprinzip verletzen und ist normalerweise ein Zeichen für ein fragwürdiges Design. Im Allgemeinen sollte jede Unterklasse in jedem Kontext verwendet werden können, der eine Basisklasse wäre. Wenn Manager s nicht .Manager s hat, dann sind sie nicht Emp s und sollten nicht von ihnen erben.

    
recursive 19.01.2010, 22:35
quelle
5

Nein - weil es das Liskov-Subsidienprinzip brechen würde. Grundsätzlich können Sie Dinge hinzufügen, aber Sie können sie nicht wegnehmen.

Sie könnten die Eigenschaft möglicherweise überschreiben, um eine Ausnahme zur Ausführungszeit auszulösen, aber Sie können dies nicht zur Kompilierzeit tun.

Wenn Sie solche Dinge generell nicht zulassen möchten, sollten Sie eher eine Komposition als eine Vererbung in Betracht ziehen, da Sie keine echte Vererbungsbeziehung haben.

    
Jon Skeet 19.01.2010 22:33
quelle
2

Nein, gibt es nicht.

Sie können die Basisklasseneigenschaft virtual festlegen und sie dann überschreiben, um eine Ausnahme im Setter zu erzeugen. Es gibt jedoch keine Möglichkeit, einen Fehler bei der Kompilierung anzugeben. Schließlich gibt es nichts, was Sie bei der Kompilierung tun, um

zu verhindern %Vor%

Sie können jedoch

schreiben %Vor%

Beachten Sie, dass das Casting nicht verhindert wird.

    
SLaks 19.01.2010 22:33
quelle
1

Wie die meisten Dinge, kommt es darauf an. Gegeben die folgenden Klassen:

%Vor%

Und der folgende Code:

%Vor%

Sie können anhand der obigen Kommentare sehen, dass Sie eine Eigenschaft überschreiben können, die nicht als virtuell deklariert ist. Die überschriebene Eigenschaft wird jedoch nur dann verwendet, wenn die Objektvariable als der Typ deklariert ist, der die Eigenschaft außer Kraft setzt - und nicht als einer ihrer Vorgänger. Dies bricht effektiv den Polymorphismus.

Fixiere stattdessen deine Vorgängerklasse.

    
David Lively 19.01.2010 22:46
quelle
0

Wie andere gesagt haben. Nein. Ich füge hinzu, dass, wenn nicht jeder Mitarbeiter einen Manager und einen Assistenten hat, Ihre Vererbungshierarchie falsch ist. Es scheint, dass das einzige, was ein Mitarbeiter und Manager teilen, ein Name ist. Sie können über Vererbung hinzufügen, aber Sie können nicht durch Vererbung wegnehmen.

    
Daniel Auger 19.01.2010 22:35
quelle
0

Nein, Sie können das nicht, und Sie würden nicht wollen - entweder Manager ist ein Mitarbeiter und hat einen Manager und einen Assistenten, oder es ist nicht und sollte daher eine andere Basisklasse haben, dh diese Situation zeigt an a Designfehler. Eine Möglichkeit könnte darin bestehen, für diese Eigenschaften null zurückzugeben, wenn dies für die Domäne sinnvoll ist.

    
Lee 19.01.2010 22:38
quelle

Tags und Links