Я издевался над RhinoMocks, и он требует, чтобы имитируемые методы были виртуальными. Это нормально, за исключением того, что у нас есть настраиваемая структура, содержащая методы, которые я хочу имитировать, но которые в настоящее время не отмечены как виртуальные.
Я не могу предвидеть каких-либо проблем с тем, чтобы сделать эти методы виртуальными, но мне было интересно, какие потенциальные опасности создания виртуальных методов, на которые я должен обратить внимание?
Я предполагаю, что Rhino переопределяет методы, чтобы имитировать интерфейс, используя тот же тип, но имитирующее поведение.





Айенде хорошо описывает, как работают виртуальные методы:
http://ayende.com/Blog/archive/2007/01/05/HowVirtualMethodsWork.aspx
На самом деле это может быть очень проблематично, если метод не предназначен для переопределения и кто-то отменяет его. В частности, никогда не вызывайте виртуальный метод из конструктора. Рассматривать:
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"
}
}
Класс Derived может не знать, что вызов виртуального метода приведет к тому, что его метод InitializeComponent будет вызван до того, как будет запущена одна строка его собственного конструктора.
Я никогда не использовал Rhino, поэтому мне любопытно, почему он этого требует. Кто-нибудь хочет объяснить?