Niedawno musiałem zaktualizować abstrakcyjną klasę bazową w niektórych OSS, których używałem, aby była bardziej testowalna, czyniąc je wirtualnymi (nie mogłem użyć interfejsu, ponieważ łączył dwa). To sprawiło, że pomyślałem, czy powinienem zaznaczyć wszystkie metody, których potrzebowałem wirtualny, czy też powinienem oznaczyć każdą publiczną metodę / właściwość wirtualną. I na ogół zgadzają się z Roy Osherove że każda metoda powinna być wirtualny, ale natknąłem się na ten artykuł, który mi do myślenia o tym, czy było to konieczne, czy nie . Dla uproszczenia ograniczę to jednak do klas abstrakcyjnych (jestem pewien, że wszystkie konkretne metody publiczne powinny być wirtualne).
Widziałem, gdzie możesz pozwolić, aby podklasa korzystała z metody, ale nie chcę, aby zastąpiła ona implementację. Jeśli jednak wierzysz, że zasada Liskowa będzie przestrzegana, to dlaczego nie pozwolisz, aby została ona nadpisana? Oznaczając go jako abstrakcyjny, i tak wymuszasz pewne przesłonięcie, więc wydaje mi się, że wszystkie metody publiczne w klasie abstrakcyjnej powinny być rzeczywiście oznaczone jako wirtualne.
Chciałem jednak zapytać na wypadek, gdyby było coś, o czym mógłbym nie myśleć. Czy wszystkie metody publiczne w klasie abstrakcyjnej powinny być wirtualne?