c# - sobrecarga - polimorfismo java
¿Cuáles son los peligros de hacer un método virtual? (3)
Ayende tiene un buen tratamiento de cómo funcionan los métodos virtuales:
http://ayende.com/Blog/archive/2007/01/05/HowVirtualMethodsWork.aspx
He estado haciendo burlas con RhinoMocks y requiere que los métodos burlados 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.
No puedo evitar ningún problema con la virtualización de estos métodos, pero me pregunto cuáles son algunos de los peligros potenciales de hacer que los métodos sean virtuales que debería tener en cuenta.
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. Considerar:
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 al método virtual dará como resultado que se invoque su método InitializeComponent antes de que se haya ejecutado una sola línea de su propio constructor.
- Si tiene usuarios que anulan sus métodos virtuales, no puede volver a sellarlos sin romper el código.
- Cualquier método virtual 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 inválido.