2013-08-21 2 views
0

У меня есть следующий выпуск:
У меня есть декоратор для класса NSButtonCell, который добавляет некоторые функции. Поскольку это декоратор - это подкласс NSButtonCell. Мне не нравилось создавать подклассы, потому что одна и та же функциональность должна быть динамически добавлена ​​\ удалена в некоторые другие подклассы NSButtonCell. И, поскольку это декоратор, я должен направить все сообщения на украшенный объект, потому что у какого-то подкласса могут быть собственные «настройки», поведение и т. Д. Поскольку NSButtonCell имеет много методов, я не могу писать код для перенаправления всех сообщений на оформленные объект. Пожалуйста, скажите, как я могу перенаправить все полученные сообщения на украшенный объект?Переслать все сообщения на другой объект

+1

Вы посмотрели на 'NSProxy'? – Wain

ответ

1

Использование NSProxy - это стандартный подход для создания объектов, которые выступают в качестве резервных копий для других объектов или объектов, которые еще не существуют. Вся его структура основана на методах обработки и передает их истинному объекту.

+0

Но, например, если бы я хотел бы реализовать образы draw-image: (NSImage *) с рамкой Frame: (NSRect) inView: (NSView *) controlView' в этом объекте декоратора? Как я должен рисовать? – Lexandr

+0

Точка прокси-сервера - переадресация вызовов на реальный объект. Когда будет вызываться 'drawImage:'? Я бы подумал больше о 'drawRect:' вызывается и устанавливает параметры для реального класса или рисунка в текущий контекст (действительный во время 'drawRect:' call. – Wain

+0

'DrawImage:' вызывается автоматически, когда кнопка перерисовывается. – Lexandr

5

Круглый пег встретить площади отверстия.

Причина, по которой вам так трудно это сделать, заключается в том, что она является чрезвычайно нестандартным шаблоном для реализации пользовательского интерфейса. Пересылка метода, реализованная либо forwardInvocation:, либо NSProxy, полезна, но практически никогда не используется для реализации шаблона Decorator в контексте пользовательского интерфейса.

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

Просто используйте подкласс и сделайте с ним.

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

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

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