Pregunta

He estado haciendo algunas 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 que actualmente no están marcados como virtuales.

No puedo ver ningún problema con hacer que estos métodos sean virtuales, pero me preguntaba ¿cuáles son algunos peligros potenciales de hacer que los métodos sean virtuales y yo debería estar atento?

¿Fue útil?

Solución

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

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"
    }
}

Es posible que la clase Derivada no sea consciente de que la llamada al método virtual dará como resultado que se llame a su método InitializeComponent antes de que se ejecute una sola línea de su propio constructor.

Otros consejos

  • Si tiene usuarios que anulan sus métodos virtuales, no puede sellarlos nuevamente sin romper el código.
  • Cualquier método virtual al que llame desde el constructor puede caer en implementaciones derivadas y si no llaman al método base y el constructor depende de él, el objeto puede estar en un estado no válido.

Ayende tiene un buen tratamiento de cómo funcionan los métodos virtuales:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top