8

私は RhinoMocks でいくつかのモックを作成してきましたが、モックされたメソッドを仮想化する必要があります。現在仮想としてマークされていない、モックしたいメソッドを含むカスタムフレームワークがあることを除いて、これは問題ありません。

これらのメソッドを仮想化することによる問題は予測できませんが、メソッドを仮想化することの潜在的な危険性にはどのようなものがあるのでしょうか?

4

3 に答える 3

9

メソッドがオーバーライドされるように設計されておらず、誰かがそれをオーバーライドすると、実際には非常に問題になる可能性があります。特に、コンストラクターから仮想メソッドを呼び出さないでください。検討:

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 クラスは、仮想メソッド呼び出しによって、独自のコンストラクターの 1 行が実行される前に InitializeComponent メソッドが呼び出されることを認識していない場合があります。

于 2008-09-26T01:51:04.123 に答える
4
  • 仮想メソッドをオーバーライドするユーザーがいる場合、コードを壊さずにそれらを再度封印することはできません。
  • コンストラクターから呼び出す仮想メソッドは派生実装に分類される可能性があり、それらが基本メソッドを呼び出さず、コンストラクターがそれに依存している場合、オブジェクトは無効な状態になる可能性があります。
于 2008-09-26T01:33:09.720 に答える
2

Ayende は、仮想メソッドがどのように機能するかをうまく説明しています。

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

于 2008-09-26T01:35:57.530 に答える