2008-09-26 10 views
6

Je me suis moqué de RhinoMocks et il faut que les méthodes mockées deviennent virtuelles. C'est bien sauf que nous avons un cadre personnalisé qui contient les méthodes que je veux mocker qui ne sont pas marquées comme virtuelles.Quels sont les dangers de rendre une méthode virtuelle?

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

+1

Je n'ai jamais utilisé Rhino, donc je suis curieux de savoir pourquoi cela l'exige. Quelqu'un veut-il expliquer? –

+0

Je suppose que Rhino remplace les méthodes afin de se moquer de l'interface en utilisant le même type mais un comportement fictif. –

Répondre

8

en fait, il peut être très problématique si la méthode n'a pas été conçu pour être surchargée et que quelqu'un le remplace. En particulier, n'appelez jamais une méthode virtuelle 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" 
    } 
} 

La classe dérivée peut ne pas être conscient du fait que l'appel de méthode virtuelle entraînera sa méthode InitializeComponent avant d'être appelé une seule ligne de son propre constructeur a été exécuté.

4
  • Si vous avez des utilisateurs qui remplacent vos méthodes virtuelles, vous ne pouvez pas les sceller à nouveau sans casser le code.
  • Toutes les méthodes virtuelles que vous appelez du constructeur peut tomber à des implémentations dérivées et si elles ne remettent pas la méthode de base et le constructeur dépend, l'objet peut être dans un état non valide
Questions connexes