Ich musste kürzlich eine abstrakte Basisklasse auf einem von mir verwendeten OSS aktualisieren, damit es durch virtuelle Erstellung besser getestet werden kann (ich konnte kein Interface verwenden, da es zwei kombiniert). Dies brachte mich zu der Überlegung, ob ich alle Methoden, die ich brauchte, als virtuell markieren sollte, oder ob ich jede öffentliche Methode / Eigenschaft als virtuell markieren sollte. Ich stimme im Allgemeinen Roy Osherove zu, dass jede Methode virtuell gemacht werden sollte, aber ich bin auf diesen Artikel gestoßen, der mich dazu brachte, darüber nachzudenken, ob dies notwendig war oder nicht . Ich werde dies der Einfachheit halber auf abstrakte Klassen beschränken (ob alle konkreten öffentlichen Methoden virtuell sein sollten, ist allerdings besonders fraglich, da ich mir sicher bin).
Ich könnte sehen, wo Sie einer Unterklasse erlauben möchten, eine Methode zu verwenden, aber nicht, dass sie die Implementierung überschreibt. Wenn Sie jedoch darauf vertrauen, dass das Substitutionsprinzip von Liskov eingehalten wird, warum sollten Sie dann nicht zulassen, dass es außer Kraft gesetzt wird? Wenn Sie es als abstrakt kennzeichnen, erzwingen Sie trotzdem eine bestimmte Überschreibung. Daher sollten meines Erachtens alle öffentlichen Methoden innerhalb einer abstrakten Klasse tatsächlich als virtuell gekennzeichnet werden.
Ich wollte jedoch fragen, ob es etwas gibt, an das ich nicht denken könnte. Sollen alle öffentlichen Methoden innerhalb einer abstrakten Klasse virtuell gemacht werden?