1

画像処理と GUI 機能が厳密に分割されていないレガシー コードから、ImageEditor と呼ばれる大規模で複雑なクラスの一連の単体テストを作成しています。クラスのメソッドの 1 つである BaseImageChanged は、画像がどのように表示されるかに完全に関係しているようで、不要な複雑さを避けるために単体テストで無効にする必要があります。テスト プロジェクトは C# で、元のコードは VB です。私の考えは、C# でクラスのデコレータを作成し、何もしない空のメソッドの背後にメソッドを隠すことでした。ただし、単体テストを実行しようとすると、VB コードは古い BaseImageChanged メソッドを、置換が存在しないかのように参照し続けます。これが私がやっていることです:

(VBクラス)

Public Class ImageEditor
  ...
  Public Sub BaseImageChanged()
  ...
  End Sub
  ...
End Class

(C#クラス)

class ImageEditorTestingClass : ImageEditor_Accessor
{
   public new void BaseImageChanged() {}
}

この種の相互運用性を達成する方法はありますか、それとも別の方法を見つける必要がありますか?

編集: コンパイラ エラーは、リフレクションの問題であることが判明しました。また、基本クラスが元の ImageEditor クラスではなく ImageEditor のアクセサーである限り、メソッドのオーバーライドは機能しませんでした (コンパイラ エラーは発生しませんが、基本メソッドの動作はオーバーライドされませんでした)。

4

3 に答える 3

1

VB コードにアクセスできますか? その場合、仮想としてマークします (C# 構文)。次に、C# コードで空の本体でオーバーライドして、id が何もしないようにします。

メソッドやプロパティを再宣言するために「new」を (ほとんど) 使用しないでください。一部のコードがそれが基底クラスであると想定している場合、派生クラスを渡したとしても、基底メソッドが呼び出されます。

理解を深めるために、.NET での遅延バインディングと早期バインディングについてお読みください。

早期バインディングと遅延バインディング

以下の私のコメントにより、@estanfordがこの回答を受け入れたようです

「BaseImageChanged を呼び出す場所では、リフレクションを使用してみてください」

于 2011-04-20T16:17:55.937 に答える
0

私はVBをまったく知りませんが、これはメソッドを非表示にするというよりも、virtualメソッドを非表示にする場合のように聞こえますoverride。VBコードはおそらくどこかで「this.BaseImageChanged()」を呼び出していますが、これは新しいメソッドを呼び出さないでしょう...そうですか?

于 2011-04-20T16:12:25.970 に答える
0

ここで何が起こっているようです

  1. あなたはVB.Netで書かれたライブラリを持っています
  2. 単体テストは C# で記述され、MSTest を使用しています
  3. 元のクラスではなく、生成されたアクセサーから派生しようとしています

この場合、唯一の選択肢は を使用することnewです。生成されたアクセサー クラスは仮想メソッドを追加しないため、同じ名前の代替メソッドを提供する場合は、それnewを行う唯一の方法です。

于 2011-04-20T16:40:00.113 に答える