Question

Je me suis moqué de RhinoMocks et cela nécessite que les méthodes fictives soient rendues virtuelles. C’est très bien, sauf que nous avons un framework personnalisé qui contient les méthodes que je veux simuler et qui ne sont pas marquées comme virtuelles.

Je ne vois pas de problème à rendre ces méthodes virtuelles, mais je me demandais quels sont les dangers potentiels de cette méthode que je devrais rechercher.

Était-ce utile?

La solution

En fait, cela peut être très problématique si la méthode n'est pas conçue pour être remplacée et que quelqu'un la substitue. En particulier, n'appelez jamais une méthode virtuelle à partir d'un constructeur. Considérez:

class Base {
    public Base() {
       InitializeComponent();
    }
    protected virtual void InitializeComponent() {
        ...
    }
}

class Derived : Base {
    private Button button1;
    public Derived() : base() {
        button1 = new Button();
    }
    protected override void InitializeComponent() {
        button1.Text = "I'm gonna throw a null reference exception"
    }
}

Il se peut que la classe dérivée ne sache pas que l'appel de méthode virtuelle entraînera l'appel de sa méthode InitializeComponent avant l'exécution d'une seule ligne de son propre constructeur.

Autres conseils

  • Si certains de vos utilisateurs remplacent vos méthodes virtuelles, vous ne pourrez plus les sceller sans casser le code.
  • Toutes les méthodes virtuelles que vous appelez du constructeur peuvent tomber dans des implémentations dérivées. Si elles n'appellent pas la méthode de base et que le constructeur en dépend, l'objet peut se trouver dans un état non valide.

Ayende traite bien le fonctionnement des méthodes virtuelles:

http://ayende.com/Blog/archive/2007 /01/05/HowVirtualMethodsWork.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top