2015-08-12 2 views
1

Рассмотрим следующую ситуацию: у меня есть класс A, состоящий из различных частей Part 1, Part 2 и т. Д., И я хочу расширить функциональность A путем подкласса.Ищите шаблон дизайна: переопределение метода без подкласса

Проблема: если я попытался переопределить поведение отдельных «частей» (есть лучший термин?) Таким же образом, мне пришлось бы создать один подкласс для каждой части, которая меняется, что становится беспорядочным и запутанным быстро.

В двух словах: Я хочу переопределить методы класса, не прибегая к подклассу .

Я думал о решении, но я не уверен, если это хорошая идея:

Предположим, что я хочу, чтобы переопределить Part::Method. Вместо того, чтобы использовать механизм наследования при условии моего языка, я мог бы «подделка» способность наиважнейшей по:

  • Проходя мимо Part класса функцию MethodOverride (например, в виде анонимной функции), и
  • имеющей Part::Method вызова MethodOverride

Я вижу два недостатки такого подхода:

  • он игнорирует (отлично с apable но непрактично) особенность наследования языка, который может иметь непредсказуемые побочные эффекты
  • доступа непубличных членов Part становится хлопот

Мой вопрос (ы): Существует ли установленный шаблон дизайна который разрешает описанную проблему аналогичным (или лучшим) способом? Есть ли недостатки Я пропустил?

+0

Похоже, вы описываете [шаблон стратегии] (https://sourcemaking.com/design_patterns/strategy), но я не совсем понимаю, что вы подразумеваете под «частью». Возможно, дизайн будет улучшен путем разделения каждой части на собственный класс. – jaco0646

+0

У вас могут быть лучшие ответы, если вы укажете, что такое A, часть 1, часть 2 ... контекст имеет большое значение. – Fuhrmanator

ответ

1

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

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

Visitor Pattern Example

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

Я бы создать один подкласс для каждая часть, которая изменяется

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

Strategy Pattern Example

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

+0

Я не думаю, что этот пример - посетитель. Сравните его со связанным примером: есть существенные различия. – jaco0646

+0

@ jaco0646 Я пытаюсь дать небольшой пример того, как алгоритмы содержатся в одном классе и пропускают интерфейсы для краткости. Ссылка является полным примером, но примером является моя лучшая попытка показать концепцию класса, который содержит то, что будет реализовано в одном месте, чтобы избежать подкласса с минимальным количеством кода. – Pumphouse

+1

@ jaco0646 Я передумал. Неправильный пример демонстрации концепции просто запутан. Я также не думаю, что полезно создать целый длинный пример, угадывающий, что делают его классы ... поэтому я просто удалил его. В идеале ссылки достаточно. – Pumphouse

Смежные вопросы