octobre
2007
J’avais précédemment blogué sur le fait qu’une méthode partielle ne peut pas être public ni même protected et ne peut par conséquent pas être virtuelle.
J’ai enfin compris pourquoi :
Quand la méthode partielle n’est pas redéfinie, le compilateur supprime tout simplement les appels à celle-ci. Ainsi le code suivant :
{
OnCreated();
this._Factures = new EntitySet<Facture>(new Action<Facture>(this.attach_Factures), new Action<Facture>(this.detach_Factures));
}
devient avec Reflector (donc à partir du code compilé) :
{
this._Factures = new EntitySet<Facture>(new Action<Facture>(this.attach_Factures), new Action<Facture>(this.detach_Factures));
}
La seule solution que je vois pour ne pas avoir les contraintes énoncées au début de ce post aurait été de prendre un autre choix : plutôt que de retirer les appels à la méthode partielle non redéfinie, le compilateur aurait pu générer cette méthode (mais en ne faisant rien). Cependant, je doute fort que les équipes de MS n’y ait pas pensé. Je pense plutôt qu’il me manque des éléments permettant de comprendre les raisons de ce choix. Si quelqu’un a plus d’info, n’hésitez surtout pas à me laisser un commentaire.
Pour les mêmes raisons, l’appel à la méthode partielle OnValidate ne peut se faire que par Reflexion.
Merci beaucoup Mitsu pour ces infos.
That one is easy !
Par réflexion, on peut tester l’existance ou non de la méthode afin de savoir si quelqu’un a fini par l’implémenter ou pas. Du coup l’appelant peut conditionner son code !
Par exemple, le code généré par le générateur de code de Linq to Sql, permet d’intercepter la suppression d’une entité depuis le DataContext.
Si l’utilisateur implémente cette méthode partielle, la suppression de base n’est plus appelée. Libre ensuite à l’utilisateur d’appeler ou pas ExecuteDynamicDelete… pour exécuter le comportement de base.
Si on compile une méthode vide quoi qu’il arrive, ce scénario est impossible.
Autre avantage impliqué par le pattern de bon sens: appeler une méthode vide est bien inutile et est une perte de temps et de CPU évidente ! :p
Avec les méthodes partielles, on peut en mettre partout sans complexe, seules celles utiles seront compilées.
Bye,
Mitsu