簡體   English   中英

在派生的C#類中隱藏VB類中的方法

[英]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,但這聽起來更像是帶有overridevirtual方法而不是方法隱藏的情況。 VB代碼可能在某個地方調用了“ this.BaseImageChanged()”,這不會調用您的新方法...對嗎?

看起來這里發生的是

  1. 您有一個用VB.Net編寫的庫
  2. 您的單元測試是用C#編寫的,並且正在使用MSTest
  3. 您嘗試從生成的訪問器而不是原始類派生

在這種情況下,您唯一的選擇是使用new 生成的訪問器類不會添加虛擬方法,因此,如果要提供一個具有相同名稱的替代方法, new是唯一的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM