问题
I've been doing some mocking with RhinoMocks and it requires that mocked methods be made virtual. This is fine except we have a custom framework which contains the methods that I want to mock which are currently not marked as virtual.
I can't forsee any problem with making these methods virtual but I was wondering what are some potential dangers of making methods virtual that I should look out for?
回答1:
Actually it can be very problematic if the method is not designed to be overridden and someone overrides it. In particular, never call a virtual method from a constructor. Consider:
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"
}
}
The Derived class may not be aware that the virtual method call will result in its InitializeComponent method being called before a single line of its own constructor has run.
回答2:
- If you have users that override your virtual methods you can't seal them again without breaking code.
- Any virtual methods you call from the constructor may fall down to derived implementations and if they don't call the base method and the constructor depends on it, the object may be in an invalid state
回答3:
Ayende has a nice treatment of how virtual methods work:
http://ayende.com/Blog/archive/2007/01/05/HowVirtualMethodsWork.aspx
来源:https://stackoverflow.com/questions/137260/what-are-the-dangers-of-making-a-method-virtual