我正在从一段遗留代码中为一个名为ImageEditor的大型复杂类编写一组单元测试,其中图像处理和GUI功能并未严格划分。类中的一个方法BaseImageChanged似乎完全关注图像如何显示,应该在我的单元测试中禁用,以避免不必要的复杂性。测试项目在C#中,原始代码在VB中;我的想法是在C#中为类创建一个Decorator,然后隐藏一个没有任何作用的空方法。但是,当我尝试运行单元测试时,VB代码会继续引用旧的BaseImageChanged方法,就好像替换不存在一样。这就是我正在做的事情:
(VB类)
Public Class ImageEditor
...
Public Sub BaseImageChanged()
...
End Sub
...
End Class
(C#class)
class ImageEditorTestingClass : ImageEditor_Accessor
{
public new void BaseImageChanged() {}
}
有没有办法实现这种互操作性,还是我必须找到另一种方式?
编辑:编译器错误结果是反射问题。此外,只要基类是ImageEditor的访问器而不是原始的ImageEditor类,覆盖该方法就不起作用。(没有编译器错误,但基本方法的行为没有被覆盖。)
答案 0 :(得分:1)
您是否可以访问VB代码?如果是这样,将其标记为虚拟(C#语法);然后在C#代码中用空主体覆盖它,这样id就什么都不做。
你应该(几乎)从不使用'new'来重新声明方法或属性。如果某些代码假设它是基类,即使你传递了派生类,也会调用基本方法。
为了更好地理解.NET中的后期绑定和早期绑定,请阅读
由于我在下面的评论,似乎@estanford接受了这个答案
“你在哪里调用BaseImageChanged尝试使用反射”
答案 1 :(得分:0)
我根本不了解VB,但这听起来更像是一个virtual
方法,而override
方法隐藏了一个方法。 VB代码可能在某处调用“this.BaseImageChanged()”,这不会调用你的新方法......对吗?
答案 2 :(得分:0)
看起来这里发生的是
在这种情况下,您唯一的选择是使用new
。生成的访问器类不会添加虚拟方法,因此如果要提供具有相同名称new
的备用方法,则唯一的方法是这样做。