[英]Hiding a method from a VB class in a derived C# class
我正在用一段遺留代碼為一個大型,復雜的類ImageEditor編寫一組單元測試,在這些遺留代碼中,圖像處理和GUI功能沒有嚴格划分。 該類中的一種方法BaseImageChanged似乎完全與圖像的顯示方式有關,應在我的單元測試中將其禁用以避免不必要的復雜性。 測試項目在C#中,原始代碼在VB中; 我的想法是為C#中的類創建一個Decorator,然后將該方法隱藏在不執行任何操作的空方法后面。 但是,當我嘗試運行單元測試時,VB代碼會繼續引用舊的BaseImageChanged方法,就好像不存在替代方法一樣。 這是我在做什么:
(VB類)
Public Class ImageEditor
...
Public Sub BaseImageChanged()
...
End Sub
...
End Class
(C#類)
class ImageEditorTestingClass : ImageEditor_Accessor
{
public new void BaseImageChanged() {}
}
有沒有一種方法可以實現這種互操作性,還是我必須尋找另一種方法?
編輯:編譯器錯誤原來是反射問題。 而且,只要基類是ImageEditor的訪問者而不是原始ImageEditor類的訪問者,重寫該方法就不會起作用。(無編譯器錯誤,但未重寫基方法的行為。)
您可以訪問VB代碼嗎? 如果是,則將其標記為虛擬(C#語法); 然后在C#代碼中使用空主體覆蓋它,以便id不執行任何操作。
您(幾乎)永遠不要使用“ new”來重新聲明方法或屬性。 如果某些代碼假定它是基類,則即使您傳遞派生類,也將調用基方法。
為了更好地理解,請閱讀有關.NET中的后期綁定和早期綁定的信息。
由於以下我的評論,@ estanford似乎接受了此答案
“在調用BaseImageChanged的地方嘗試使用反射”
我一點都不了解VB,但這聽起來更像是帶有override
的virtual
方法而不是方法隱藏的情況。 VB代碼可能在某個地方調用了“ this.BaseImageChanged()”,這不會調用您的新方法...對嗎?
看起來這里發生的是
在這種情況下,您唯一的選擇是使用new
。 生成的訪問器類不會添加虛擬方法,因此,如果要提供一個具有相同名稱的替代方法, new
是唯一的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.