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!
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.
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.
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
Sie können jedoch
schreiben %Vor%Beachten Sie, dass das Casting nicht verhindert wird.
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.
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.
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.
Tags und Links .net c# inheritance