【问题标题】:Behaviour of base class method when hiding/overloading helper methods in inherited class在继承类中隐藏/重载辅助方法时基类方法的行为
【发布时间】:2011-12-23 09:12:50
【问题描述】:
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

我试图为Foo 创建一个“包装器”,以便在GetName() 产生意外值时对Test() 的行为进行单元测试。我不能直接影响FooGetName() 的行为,因为它依赖于ASP.NET 管道事件。

我希望

new Bar().Test();

会返回“Bar”,但显然我误解了继承模型。

有什么方法可以满足我的需要吗?

【问题讨论】:

  • 你可以访问Foo吗?您可以将Foo.GetName() 设为虚拟并在Bar 中覆盖它吗?
  • @Steve 是的,我可以这样做,但是当我尝试时行为似乎相同。显然最好不要仅仅为了让测试正常工作而更改Foo
  • @ShellShock 现在已将此作为答案 - 它应该按照您的意愿行事。改变它“纯粹是为了让测试工作”是一种看待它的方式,改变它“更容易测试”是一种更积极的倾向:)
  • @fearofawhackplanet 实际上,您应该验证whether it should be hidden or overridden - 无论如何可能是后者(不考虑测试)?
  • @SteveWilkes 是的,这确实有效 - 奇怪的是我之前尝试过,并认为结果是一样的,我一定犯了一个错误。您是否认为使用这样的包装类是一种可接受/有效的测试技术?对我来说感觉有点老套,但在这种情况下我想不出任何替代方案。你在其他地方见过这个吗?

标签: c# unit-testing inheritance method-hiding overriding


【解决方案1】:

GetName 需要在您的 Foo 中是虚拟的,并在您的 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 可能不适合您。

【讨论】:

  • 感谢您的回答,它似乎确实有效。我真的不明白为什么使用new 不能以同样的方式工作?
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多