2008-09-26 18 views
6

He estado haciendo burlas con RhinoMocks y requiere que los métodos simulados se hagan virtuales. Esto está bien, excepto que tenemos un marco personalizado que contiene los métodos que quiero simular y que actualmente no están marcados como virtuales.¿Cuáles son los peligros de hacer que un método sea virtual?

No puedo evitar ningún problema con la virtualización de estos métodos, pero me preguntaba ¿cuáles son algunos de los peligros potenciales de hacer métodos virtuales que debería tener en cuenta?

+1

Nunca he usado Rhino, por lo que tengo curiosidad de por qué lo requiere. ¿Alguien quiere explicar? –

+0

Supongo que Rhino anula los métodos para burlarse de la interfaz utilizando el mismo tipo pero simulando el comportamiento. –

Respuesta

8

en realidad puede ser muy problemático si el método no está diseñado para ser anulado y alguien se anula. En particular, nunca llame a un método virtual desde un constructor. Considere lo siguiente:

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 clase derivada puede no ser consciente de que la llamada método virtual dará lugar a su método InitializeComponent ser llamado antes de que una sola línea de su propio constructor se ha ejecutado.

4
  • Si tiene usuarios que anulan sus métodos virtuales, no puede volver a sellarlos sin romper el código.
  • Los métodos virtuales que llaman desde el constructor puede caer hacia abajo para implementaciones derivadas y si no lo llaman el método de base y el constructor depende de ello, el objeto puede estar en un estado no válido
Cuestiones relacionadas