Wie verbiete ich, dass eine Klassenmethode / -eigenschaft in C # überschrieben wird?

8

Ich glaube, ich möchte einige Methoden und Eigenschaften einer Klasse nicht überschreibbar machen und die Implementierung der Basis in allen abgeleiteten Klassen verwenden. Wie erreiche ich das? Das versiegelte Schlüsselwort scheint nicht zu funktionieren und besagt, dass die Methode nicht versiegelt werden kann, da es sich nicht um eine Überschreibung handelt.

    
Ivan 05.07.2011, 16:24
quelle

5 Antworten

14

Mitglieder werden standardmäßig in C # versiegelt - sofern sie nicht als virtuell markiert sind, können sie trotzdem nicht in abgeleiteten Klassen überschrieben werden.

Sie können in abgeleiteten Klassen shadowed sein, zugegebenermaßen:

%Vor%

... aber das ist nicht das Gleiche wie das Überschreiben. Es gibt keine Möglichkeit, das zu verhindern, aber wenn ein Aufrufer einen Kompilierungszeittyp der Basisklasse verwendet, wird er dies nicht versehentlich trotzdem aufrufen.

Wenn Sie uns genauere Informationen zu genau geben könnten, was Sie verhindern möchten (sowohl vom POV des Aufrufers als auch vom aufgerufenen Code), können wir möglicherweise mehr helfen.

    
Jon Skeet 05.07.2011, 16:27
quelle
5

Eine Methode, die noch keine Überschreibung ist, wird nicht überschrieben, wenn Sie sie nicht als virtual markieren. Es klingt also so, als wäre keine Aktion nötig.

%Vor%

Der Modifizierer sealed wird nur angewendet, wenn eine Methode bereits eine Überschreibung eines Members in der Basisklasse ist. Auf diese Weise können Sie Überschreibungen in Unterklassen von dieser -Klasse verhindern.

%Vor%     
harpo 05.07.2011 16:28
quelle
2

Dies ist nicht möglich. Eine abgeleitete Klasse kann immer das neue Schlüsselwort verwenden, um ihre Elternmethoden zu verstecken (nicht zu überschreiben). Das versiegelte Schlüsselwort verhindert lediglich, dass die abgeleitete Klasse eine virtuelle Methode überschreibt, aber es könnte immer noch new verwenden, um die Basismethode auszublenden.

    
Coeffect 05.07.2011 16:27
quelle
1

Das Schlüsselwort "sealed" kann nur verwendet werden, wenn Sie eine Methode überschreiben, die virtuell ist, aber nicht möchten, dass eine Klasse, die von Ihrer Implementierung abgeleitet wird, diese überschreibt. Nur die Methode zu deklarieren ist nicht virtuell.

Wie andere darauf hingewiesen haben, gibt es tatsächlich ein "neues" Schlüsselwort, mit dem die Methode versteckt werden kann. Solange Sie jedoch eine Referenz Ihrer Basisklasse verwenden, wird Ihre Basismethode immer aufgerufen:

%Vor%

Da das Bereitstellen einer Basisklasse nur sinnvoll ist, solange Sie einen "BaseClass" -Zeiger überall verwenden, kann Ihre Methode nicht versteckt werden.

    
J. Tihon 05.07.2011 16:32
quelle
0

Genau dafür steht sealed keyword.

Ссылка

  

Ein Klassenmitglied, Methode, Feld,   Eigenschaft oder Ereignis für eine abgeleitete Klasse   das überschreibt ein virtuelles Mitglied von   Die Basisklasse kann dieses Mitglied deklarieren   wie versiegelt. Dies negiert das Virtuelle   Aspekt des Mitglieds für weitere   abgeleitete Klasse. Dies wird erreicht durch   das versiegelte Schlüsselwort vor den   Überschreiben Sie das Schlüsselwort im Klassenmitglied   Erklärung.

Wenn Sie eine Methode aus der Basisklasse überschrieben haben, verwenden Sie sealed . Wenn Sie eine Methode in der Klasse deklariert haben und nicht in abgeleiteten Klassen überschrieben werden sollen, wählen Sie nicht als virtual . Nur virtual Mitglieder können überschrieben werden.

    
Jakub Konecki 05.07.2011 16:27
quelle

Tags und Links