Использование наследования исключительно для обмена общими функциями - PullRequest
7 голосов
/ 10 марта 2010

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

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

Ответы [ 4 ]

3 голосов
/ 10 марта 2010

Наследование можно использовать (и злоупотреблять!) По-разному. Вот три большие категории.

Концептуальная иерархия:

концептуально связанные классы могут быть организована по специализации иерархия:

  • люди, сотрудники, менеджеры
  • геометрические объекты ...

Полиморфизм:

Объекты разные, но связанные классы могут быть единообразно клиенты

  • массив геометрических объектов

Повторное использование программного обеспечения:

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

  • геометрические объекты ...

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

Случай, который вы упоминаете, это повторное использование программного обеспечения . Нет отношения is-a , самое большее отношение has-a . Целью является в основном повторное использование одного и того же кода.

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

3 голосов
/ 10 марта 2010

Если методы родительского класса существуют исключительно как «утилиты», тогда да, я согласен.

Вопрос (по крайней мере для меня) заключается в том, можно ли в будущем изменить родительский класс, чтобы получить выгоду. То есть, какие логические отношения сейчас существуют? Если это «есть» между дочерним элементом и родителем, оставьте это. Если родительский объект является просто набором методов, выполните рефакторинг в служебный класс или используйте делегирование.

3 голосов
/ 10 марта 2010

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

Если между дочерним и родительским классами нет отношения is-is, наследование не должно использоваться.

0 голосов
/ 10 марта 2010

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

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