Скрытие метода от класса VB в производном классе C # - PullRequest
1 голос
/ 20 апреля 2011

Я пишу набор модульных тестов для большого, сложного класса, называемого ImageEditor, из унаследованного кода, где обработка изображений и функциональность графического интерфейса пользователя строго не разделены.Один из методов в классе, BaseImageChanged, кажется, полностью озабочен тем, как изображения отображаются, и должен быть отключен в моих модульных тестах, чтобы избежать ненужной сложности.Тестовый проект на C #, а оригинальный код на VB;Моя идея состояла в том, чтобы создать Decorator для класса в 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 (ошибки компилятора нет, но поведение базового метода не было переопределено).

Ответы [ 3 ]

1 голос
/ 20 апреля 2011

У вас есть доступ к коду VB?если это так, отметьте его как виртуальный (синтаксис C #);Затем в коде C # переопределите его с пустым телом, чтобы id ничего не делал.

Вы не должны (почти) никогда не использовать 'new' для переопределения методов или свойств.Если какой-то код предполагает, что это базовый класс, даже если вы передадите ему производный, будут вызваны базовые методы.

Для лучшего понимания прочитайте о позднем и раннем связывании в .NET

Раннее и позднее связывание

Кажется, @estanford принял этот ответ из-за моего комментария ниже

"Когда вы вызываете BaseImageChanged, попробуйте использовать отражение"

0 голосов
/ 20 апреля 2011

Похоже, что здесь происходит следующее:

  1. У вас есть библиотека, написанная на VB.Net
  2. Ваши модульные тесты написаны на C # и используют MSTest
  3. Вы пытаетесь наследовать от сгенерированного средства доступа вместо исходного класса

В этом случае единственный вариант, который у вас есть, это использовать new.Сгенерированный класс средства доступа не будет добавлять виртуальные методы, и, следовательно, если вы хотите предоставить альтернативный метод с тем же именем new, это единственный способ сделать это.

0 голосов
/ 20 апреля 2011

Я вообще не знаю VB, но это больше похоже на случай virtual метода с override, чем на скрытие метода.Код VB, вероятно, где-то вызывает "this.BaseImageChanged ()", что не вызовет ваш новый метод ... верно?

...