En C#, vous devez marquer méthode virtuelle pour le rendre possible de remplacer. Veut-il dire qu'en C#, vous devez marquer toutes les méthodes virtuelles (à l'exception de quelques-uns que vous ne voulez pas être remplacée), depuis plus de chances que vous ne savez pas de quelle manière votre classe peut être héréditaire?
Pas de. Si la langue concepteurs pensaient que virtuel doit avoir été la valeur par défaut alors qu'il aurait été la valeur par défaut.
Overridablility est une fonction, et, comme toutes les fonctions qu'il a des coûts. Les coûts d'une remplacable méthode sont considérables: il y a des gros de la conception, de la mise en œuvre et les coûts de test, en particulier s'il existe une "sensibilité" à la classe; les méthodes virtuelles sont des moyens de présenter les tiers non testés code dans un système et qui a un impact sur la sécurité.
Si vous ne savez pas comment vous avez l'intention de votre classe à être héréditaire, alors ne publiez pas votre classe parce que vous n'avez pas terminé la conception de il encore. Votre modèle d'extensibilité est certainement quelque chose que vous devriez savoir à l'avance le temps; il doit profondément influencer votre conception de la stratégie de test et de.
Je plaide pour que toutes les classes être scellé et toutes les méthodes de non-virtuel jusqu'à ce que vous avez dans le monde réel centrées sur le client la raison pour desceller ou de faire une méthode virtuelle.
Fondamentalement, votre question est "je suis ignorant de la façon dont mes clients ont l'intention de consommer de ma classe; dois-je donc faire de manière arbitraire extensible?" Non, vous devez devenir bien informé! Vous ne demandez pas "je ne sais pas comment mes clients vont utiliser ma classe, donc si je fais toutes mes propriétés en lecture-écriture? Et je dois faire tous mes méthodes de lecture-écriture des propriétés de type délégué pour que mes utilisateurs peuvent remplacer n'importe quelle méthode avec leur propre mise en œuvre?" Non, ne pas faire aucune de ces choses jusqu'à ce que vous avez la preuve que l'utilisateur a réellement besoin de cette capacité! Passer votre temps précieux à la conception, le test et la mise en œuvre de fonctionnalités que les utilisateurs veulent et ont besoin, et de le faire à partir d'une position de la connaissance.