J'ai récemment dû mettre à jour une classe de base abstraite sur un OSS que j'utilisais pour qu'il soit plus testable en les rendant virtuels (je ne pouvais pas utiliser une interface car elle en combinait deux). Cela m'a fait penser si je devais marquer toutes les méthodes dont j'avais besoin comme virtuelles, ou si je devrais marquer chaque méthode / propriété publique virtuelle. Je suis généralement d' accord avec Roy Osherove pour dire que chaque méthode doit être rendue virtuelle, mais je suis tombé sur cet article qui m'a fait réfléchir à savoir si c'était nécessaire ou non . Je vais cependant limiter cela aux classes abstraites pour plus de simplicité (si toutes les méthodes publiques concrètes doivent être virtuelles est particulièrement discutable, j'en suis sûr).
Je pouvais voir où vous pourriez autoriser une sous-classe à utiliser une méthode, mais ne pas vouloir qu'elle remplace l'implémentation. Cependant, tant que vous croyez que le principe de substitution de Liskov sera respecté, pourquoi ne permettriez-vous pas qu'il soit annulé? En la marquant abstraite, vous forcez de toute façon une certaine surcharge, donc, il me semble que toutes les méthodes publiques à l'intérieur d'une classe abstraite devraient en effet être marquées virtuelles.
Cependant, je voulais demander au cas où il y aurait quelque chose auquel je ne penserais peut-être pas. Toutes les méthodes publiques d'une classe abstraite doivent-elles être rendues virtuelles?