Базовый класс против коммунального класса
Вопрос
Какой из двух должен быть предпочтительным?
Есть некоторые методы, которые называются классом A, B и C.
Должны ли эти методы быть инкапсулированы в класс D (база A, B и C)?
ИЛИ ЖЕ
Если эти методы будут инкапсулированы в класс U и другие классы, создает объект для использования методов по мере необходимости.
На каком основании следует принимать решение?
Спасибо.
Решение
Вы должны сделать static
утилита класса.
Используйте наследование только в том случае, если оно на самом деле значимо - если A
, B
, а также C
фактически находятся а D
.
Другие советы
Я бы основал решение на том, что делают методы, если они делают вещи, конкретные для классов A, B и C, то они должны быть в базовом классе. Это помогает поддерживать чистоту кода, скрывая функциональность, связанные с классом, от остальной части системы. (Конечно, я предполагаю, что A, B и C либо уже наследуют от D, либо, очевидно, связаны)
Если они делают что -то с другими типами, это не присуща тем, что делают A, B и C, то чтобы максимизировать возможности для повторного использования, они должны быть в урок.
Если они делают что-то с другими типами, специфичными для этого другого типа (например, довольно напечатать DateTime) подумайте о том, чтобы сделать их методами расширения для что тип.
Я бы склонялся от наследства, если не будет очевидного это отношение. Я подозреваю из вашего описания выше, что это не так. Мои предпочтительные решения были бы:
- внедрять экземпляр коммунального класса в ваш A, B, C
- иметь, B, C создайте подходящие классы полезности
Преимущество инъекции класса заключается в том, что вы можете предоставить различные реализации тривиально. Это особенно полезно для тестирования. Одиночные или классы со статическими методами, как правило, вызывают проблемы по той же причине - вы не можете легко переопределить или заменить их.
Используйте базовый классЕсли вы собираетесь написать какую -то логику только в зависимости от базового класса, то имеет смысл создать базовый класс. В этом случае ваш производный класс должен быть полностью заменен на ваш базовый класс. Не должно быть никакой логики переключения, чтобы проверить производный тип и действовать соответственно. См. Принцип замены Лискова: http://en.wikipedia.org/wiki/liskov_substitution_principle
Используйте утилита классаУ некоторых языков есть ограничение, что они не поддерживают множественное наследство. Если у вас уже есть значимый базовый класс, вам нужно пойти на утилиту. Кроме того, когда вы используете наследование, вы создаете тесную связь между классом Dereried до базового класса.
Я бы пошел на базовый класс, если бы полученный класс естественным образом заменяет его базовый класс. Если цель состоит в том, чтобы поделиться каким -то многоразовым кодом между классами, то имеет больше смысла идти с утилитом.