Frage

Ich habe einige spöttische mit RhinoMocks getan und es erfordert, dass verspottet Methoden virtuell gemacht werden. Das ist in Ordnung, außer wir einen benutzerdefinierten Rahmen, der die Methoden enthält, die ich verspotten wollen, die derzeit nicht als virtuelle markiert.

Ich kann kein Problem forsee diese Methoden virtuell mit der Herstellung, aber ich frage mich, was einige potenzielle Gefahren zu machen Methoden virtuell sind, dass ich achten sollte?

War es hilfreich?

Lösung

Eigentlich kann es sehr problematisch sein, wenn das Verfahren nicht außer Kraft gesetzt werden soll und jemand außer Kraft gesetzt. Insbesondere nie eine virtuelle Methode von einem Konstruktor aufrufen. Bedenken Sie:

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

Die abgeleitete Klasse kann nicht darüber im Klaren sein, dass der virtuelle Methodenaufruf in der InitializeComponent-Methode führen wird, bevor ausgeführt wird eine einzelne Zeile seines eigenen Konstruktor aufgerufen wird.

Andere Tipps

  • Wenn Sie Benutzer haben, die Ihre virtuellen Methoden außer Kraft setzen können Sie sich nicht versiegeln wieder ohne Code zu brechen.
  • Jede virtuelle Methoden, die Sie aus dem Konstruktor aufrufen, um abgeleitete Implementierungen können herunterfallen und wenn sie die Basismethode nicht aufrufen und der Konstruktor hängt davon ab, kann das Objekt in einem ungültigen Zustand
  • sein

Ayende hat eine schöne Behandlung, wie virtuelle Methoden funktionieren:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top