What are the dangers of making a method virtual?

倾然丶 夕夏残阳落幕 提交于 2020-01-11 05:14:12

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!