Вопрос

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

Есть некоторые методы, которые называются классом A, B и C.

Должны ли эти методы быть инкапсулированы в класс D (база A, B и C)?

ИЛИ ЖЕ

Если эти методы будут инкапсулированы в класс U и другие классы, создает объект для использования методов по мере необходимости.

На каком основании следует принимать решение?

Спасибо.

Это было полезно?

Решение

Вы должны сделать static утилита класса.

Используйте наследование только в том случае, если оно на самом деле значимо - если A, B, а также C фактически находятся а D.

Другие советы

Я бы основал решение на том, что делают методы, если они делают вещи, конкретные для классов A, B и C, то они должны быть в базовом классе. Это помогает поддерживать чистоту кода, скрывая функциональность, связанные с классом, от остальной части системы. (Конечно, я предполагаю, что A, B и C либо уже наследуют от D, либо, очевидно, связаны)

Если они делают что -то с другими типами, это не присуща тем, что делают A, B и C, то чтобы максимизировать возможности для повторного использования, они должны быть в урок.

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

Я бы склонялся от наследства, если не будет очевидного это отношение. Я подозреваю из вашего описания выше, что это не так. Мои предпочтительные решения были бы:

  1. внедрять экземпляр коммунального класса в ваш A, B, C
  2. иметь, B, C создайте подходящие классы полезности

Преимущество инъекции класса заключается в том, что вы можете предоставить различные реализации тривиально. Это особенно полезно для тестирования. Одиночные или классы со статическими методами, как правило, вызывают проблемы по той же причине - вы не можете легко переопределить или заменить их.

Используйте базовый классЕсли вы собираетесь написать какую -то логику только в зависимости от базового класса, то имеет смысл создать базовый класс. В этом случае ваш производный класс должен быть полностью заменен на ваш базовый класс. Не должно быть никакой логики переключения, чтобы проверить производный тип и действовать соответственно. См. Принцип замены Лискова: http://en.wikipedia.org/wiki/liskov_substitution_principle

Используйте утилита классаУ некоторых языков есть ограничение, что они не поддерживают множественное наследство. Если у вас уже есть значимый базовый класс, вам нужно пойти на утилиту. Кроме того, когда вы используете наследование, вы создаете тесную связь между классом Dereried до базового класса.

Я бы пошел на базовый класс, если бы полученный класс естественным образом заменяет его базовый класс. Если цель состоит в том, чтобы поделиться каким -то многоразовым кодом между классами, то имеет больше смысла идти с утилитом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top