Meiner Meinung nach ist die derzeit akzeptierte Antwort unnötig dogmatisch.
Fakt ist, wenn Sie eine Methode nicht als markieren virtual
, können andere ihr Verhalten nicht überschreiben, und wenn Sie eine Klasse als markieren, sealed
können andere nicht von der Klasse erben. Dies kann erhebliche Schmerzen verursachen. Ich weiß nicht, wie oft ich eine API zum Markieren von Klassen sealed
oder zum Nichtmarkieren von Methoden verflucht habe , virtual
nur weil sie meinen Anwendungsfall nicht vorweggenommen haben.
Theoretisch mag es der richtige Ansatz sein, nur überschreibende Methoden und das Erben von Klassen zuzulassen, die überschrieben und vererbt werden sollen. In der Praxis ist es jedoch unmöglich, jedes mögliche Szenario vorherzusehen, und es gibt wirklich keinen guten Grund, sich so zu verschließen.
- Wenn Sie keinen guten Grund haben, markieren Sie Klassen nicht als
sealed
.
- Wenn Ihre Bibliothek von anderen verwendet werden soll, versuchen Sie zumindest, die Hauptmethoden einer Klasse, die das Verhalten enthalten, als zu markieren
virtual
.
Eine Möglichkeit, den Aufruf zu tätigen, besteht darin, den Namen der Methode oder Eigenschaft zu überprüfen. Eine GetLength () -Methode in einer Liste macht genau das, was der Name impliziert, und lässt nicht viel Interpretation zu . Eine Änderung der Implementierung wäre wahrscheinlich nicht sehr transparent, so dass es virtual
wahrscheinlich unnötig ist , sie zu markieren . Das Markieren der Add
Methode als virtuell ist weitaus nützlicher, da jemand eine spezielle Liste erstellen könnte, die nur einige Objekte über die Add-Methode usw. akzeptiert. Ein weiteres Beispiel sind benutzerdefinierte Steuerelemente. Sie möchten die Hauptzeichnungsmethode festlegen, virtual
damit andere den Großteil des Verhaltens verwenden und nur das Aussehen ändern können, aber Sie würden die X- und Y-Eigenschaften wahrscheinlich nicht überschreiben.
Am Ende muss man diese Entscheidung oft nicht sofort treffen. In einem internen Projekt, in dem Sie den Code trotzdem leicht ändern können, würde ich mir über diese Dinge keine Sorgen machen. Wenn eine Methode überschrieben werden muss, können Sie sie in diesem Fall jederzeit virtuell gestalten. Im Gegenteil, wenn das Projekt eine API oder Bibliothek ist, die von anderen verwendet wird und nur langsam aktualisiert wird, lohnt es sich auf jeden Fall, darüber nachzudenken, welche Klassen und Methoden nützlich sein könnten. In diesem Fall denke ich, dass es besser ist, offen zu sein, als streng geschlossen zu sein.