2
public class Foo 
{ 
    public string Test() 
    { 
     return GetName(); 
    } 

    public string GetName() 
    { 
     return "Foo"; 
    } 
} 

public class Bar : Foo 
{ 
    public new string GetName() 
    { 
     return "Bar"; 
    } 
} 


new Foo().Test(); // Foo 

new Bar().Test(); // also Foo 

が、私はそう、私はユニットテストTest()の振る舞いをGetName()が予期しない値を生成することができることをFooための「ラッパー」を作成しようとしていた継承されたクラスのヘルパーメソッドをオーバーロードする/非表示にする場合。私はGetName()の動作がFooにASP.NETパイプラインイベントに依存するため直接影響を与えることはできません。挙動は

私は "バー" を返しますが、明らかに私は継承モデルを誤解している

new Bar().Test();

を期待していました。

私は必要なものを達成する方法はありますか?

+0

あなたは 'Foo'にアクセスできますか? 'Foo'.GetName'()をバーチャルにして、' Bar'でオーバーライドできますか? –

+0

@スティーブはい私はそれを行うことができましたが、私が試したときの動作は同じようでした。そして、純粋にテストを動作させる目的で 'Foo'を変更しないことが明らかです。 – fearofawhackplanet

+0

@ShellShockはこれを答えにしました。これは必要に応じて動作するはずです。それを「純粋に動作するテストを得るために」変更することは、それを見る方法の1つです。それを「よりテスト可能」に変更することは、より積極的な傾きです。:) –

答えて

3

FooではGetNameをバーチャルで、Barクラスではオーバーライドする必要があります。

public class Foo 
{ 
    public string Test()  
    {   
     return GetName(); 
    } 

    public virtual string GetName() 
    { 
     return "Foo"; 
    } 
} 

public class Bar : Foo 
{ 
    public override string GetName() 
    { 
     return "Bar"; 
    } 
} 

編集:このように、私は今変更fooはあなたのためのオプションではないかもしれないことをあなたの新しいコメントからご覧ください。

+0

この回答をお寄せいただきありがとうございます。私は本当に 'new'を使って同じように動作しないのはなぜですか? – fearofawhackplanet