Базовый класс против Класса полезности - PullRequest
5 голосов
/ 15 марта 2011

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

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

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

ИЛИ

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

На каком основании должно быть принято решение?

Спасибо.

Ответы [ 4 ]

10 голосов
/ 15 марта 2011

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

Используйте наследование только в том случае, если оно действительно имеет смысл - если A, B и C на самом деле равны a D.

3 голосов
/ 15 марта 2011

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

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

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

2 голосов
/ 15 марта 2011

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

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

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

0 голосов
/ 15 марта 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...