Скучные объекты - объявить все методы виртуальными или использовать интерфейс?

В .net, в отличие от Java, методы по умолчанию не являются виртуальными. Чтобы использовать большинство инфраструктур макета, вам нужно либо пометить методы, которые вы хотите использовать для вашего макета как виртуальные на "реальном" объекте, или вы должны иметь интерфейс, который вы можете издеваться над тем, что тестируемый класс будет принять вместо реализации.

Кажется, что плохая форма подходит и маркирует каждый метод как виртуальный, но также кажется неправильной формой для определения интерфейса для каждого отдельного класса.

Что лучше всего делать?

Ответ 1

Мое правило состоит в том, чтобы определить интерфейс, если я ожидаю, что у меня будет несколько реализаций, либо конкретные конкретные классы приложений, либо одна реализация приложения, и ложная реализация для модульного тестирования. Если я ожидаю только одну реализацию, и класс не нуждается в подделке (в большинстве случаев это не так), тогда я пошлю маршрут виртуального метода и рефакторинг к интерфейсу по мере необходимости.

Ответ 2

Если мне нужно выбирать между ними, я бы пошел с интерфейсом. Интерфейс предназначен для определения контракта, который в основном является тем, к чему будет привязываться макет. Маркировка метода как виртуального может иметь непредвиденные побочные эффекты. Это влияет на оформление фактического класса, издевающегося над ним. Интерфейс просто определяет имена методов и не влияет на реальный класс.

Ответ 3

Кто говорит, что вы издеваетесь над объектом, должен происходить из той же иерархии классов?

Намного проще создать простой автономный класс, который имеет необходимый интерфейс и создает экземпляры этого объекта.

Вы даже можете создать иерархию макетных классов и использовать это для модульного тестирования.

Ответ 4

Лучше всего использовать свою голову. Подумайте о своем сценарии, если имеет смысл использовать виртуальную, тогда сделайте это. Если, однако, интерфейс лучше подходит для вашей задачи, тогда сделайте это.

Итак, я вижу это как при добавлении новой функциональности

  • Наследование: используйте виртуальные методы.
  • Состав: использование интерфейсов.

Я уверен, что есть куча оговорок. Так что просто используйте свою голову и делайте то, что проще всего в вашем сценарии.