2008-09-26 14 views
6

私はRhinoMockをいくつか試してきましたが、模倣されたメソッドを仮想化する必要があります。これは、現在私が仮想としてマークされていない模擬したいメソッドを含むカスタムフレームワークを持っていることを除いて、問題ありません。メソッドを仮想化する危険性は何ですか?

私はこれらのメソッドを仮想化することで何か問題を予測することはできませんが、私が見なければならないメソッドを仮想化する潜在的な危険性は何ですか?

+1

私はRhinoを一度も使用していないので、なぜこれが必要なのか不思議です。誰でも気をつけて説明しますか? –

+0

私はRhinoが同じタイプを使用してインターフェイスを模擬するためにメソッドをオーバーライドすると仮定していますが、モックの動作。 –

答えて

8

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

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

派生クラスには、独自のコンストラクタの単一の行が実行された前に、仮想メソッド呼び出しが呼び出され、そのInitializeComponentメソッドにつながることを認識しないかもしれません。

4
  • 仮想メソッドをオーバーライドするユーザーがいる場合は、コードを破棄せずに再度それらを封印することはできません。
  • 任意の仮想メソッドを使用するには、コンストラクターが派生実装に倒れてから呼び出すと、彼らは基本メソッドを呼び出さないと、コンストラクタはそれに依存している場合、オブジェクトは
関連する問題