Domanda

Ho fatto un po 'di derisione con RhinoMocks e richiede che i metodi derisi siano resi virtuali. Questo va bene tranne per il fatto che abbiamo un framework personalizzato che contiene i metodi che desidero deridere che attualmente non sono contrassegnati come virtuali.

Non riesco a scorgere alcun problema nel rendere virtuali questi metodi, ma mi chiedevo quali sono alcuni potenziali pericoli nel rendere virtuali i metodi che dovrei cercare?

È stato utile?

Soluzione

In realtà può essere molto problematico se il metodo non è progettato per essere ignorato e qualcuno lo ignora. In particolare, non chiamare mai un metodo virtuale da un costruttore. Prendere in considerazione:

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 Derived potrebbe non essere consapevole del fatto che la chiamata al metodo virtuale comporterà la chiamata al suo metodo InitializeComponent prima dell'esecuzione di una singola riga del proprio costruttore.

Altri suggerimenti

  • Se hai utenti che hanno la precedenza sui tuoi metodi virtuali, non puoi sigillarli di nuovo senza rompere il codice.
  • Qualsiasi metodo virtuale che chiami dal costruttore può cadere in implementazioni derivate e se non chiamano il metodo di base e il costruttore dipende da esso, l'oggetto potrebbe trovarsi in uno stato non valido

Ayende ha un buon trattamento del funzionamento dei metodi virtuali:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top