Di recente ho dovuto aggiornare una classe base astratta su alcuni OSS che stavo usando in modo che fosse più testabile rendendoli virtuali (non potevo usare un'interfaccia poiché ne combinava due). Questo mi ha fatto pensare se dovevo contrassegnare tutti i metodi di cui avevo bisogno virtuale o se dovessi contrassegnare ogni metodo / proprietà pubblica virtuale. Sono generalmente d'accordo con Roy Osherove sul fatto che ogni metodo dovrebbe essere reso virtuale, ma mi sono imbattuto in questo articolo che mi ha fatto pensare se fosse necessario o meno . Lo limiterò a classi astratte per semplicità, tuttavia (se tutti i metodi pubblici concreti dovrebbero essere virtuali è particolarmente discutibile, ne sono sicuro).
Potrei vedere dove potresti voler consentire a una sottoclasse di utilizzare un metodo, ma non volerlo ignorare l'implementazione. Tuttavia, fintanto che ti fidi che il Principio di sostituzione di Liskov sarà seguito, allora perché non dovresti permettere che venga annullato? Contrassegnandolo come astratto, stai forzando comunque un certo override, quindi mi sembra che tutti i metodi pubblici all'interno di una classe astratta debbano essere contrassegnati come virtuali.
Tuttavia, volevo chiedere nel caso ci fosse qualcosa a cui potrei non pensare. Tutti i metodi pubblici all'interno di una classe astratta dovrebbero essere resi virtuali?