Смешивать и сочетать класс в C ++ / MFC - PullRequest
1 голос
/ 03 января 2011

Я пытаюсь пересмотреть кодовую базу, и среди несвязанных классов есть некоторые общие функциональные возможности, которые я хотел бы объединить. Я хотел бы добавить эту функциональность в общий базовый класс, но я не уверен, что это чистый и хороший подход.

Допустим, у меня есть CMyWnd класс и CMyDialogEx класс, оба разные, поэтому они не могут наследовать от одного базового класса. Я хочу добавить кнопку в оба класса и добавить обработчики сообщений в оба класса.

Так что я хотел бы сделать что-то вроде этого:

CMyWnd : public CWnd, public COnOkBtnFunctionality, public COnCancelBtnFunctionality
CMyDialogEx: public CWnd, public COnOkBtnFunctionality

Где COnOkBtnFunctionality будет определять CButton m_buttonOk и все функции afx_msg, которые он должен иметь. И так далее.

Является ли этот подход выполнимым / хорошим? Или есть лучшие образцы, к которым я должен прибегнуть?

Ответы [ 4 ]

4 голосов
/ 03 января 2011

Вы испытываете проблемы из-за дизайна COnOkBtnFunctionality, который требует использования наследования только для повторного использования кода.

Краткое напоминание: Наследование не предназначено для повторного использования кода, онопредназначен для введения абстракции.

Или другими словами: ваш CMyWnd является специфическим видом COnOkBtnFunctionality, или он имеет COnOkBtnFunctionality?

Позвольте мне перенаправить вас к Джеффу Этвуду за дополнительной информацией по теме: http://www.codinghorror.com/blog/2004/08/inherits-nothing.html


В основном вы хотите использовать множественное суперклассирование для реализации функциональности Mixin .Такая реализация имеет свои достоинства, но также и недостатки.

Подумайте, как можно реализовать COnOkBtnFunctionality и семейство, чтобы их можно было использовать в качестве компонентов, а не суперклассов вашего класса Window. Это, безусловно, возможно, и вам, вероятно, понравитсярезультат.

В качестве альтернативы я могу порекомендовать вам одну вещь - шаблон Decorator , который может быть именно тем, что вам нужно.Преимущество заключается в том, что «расширения» могут быть легко выбраны и применены выборочно во время выполнения.

3 голосов
/ 03 января 2011

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

2 голосов
/ 03 января 2011

Композиция будет правильным дизайнерским решением;не наследуйте.

Если у вас есть специальный тип кнопки, которую можно использовать повторно, создайте ее: class MyButton : public CButton

Если MyButton нужен доступ к методам из CMyDialogEx и CMyWnd, извлеките общие методы из виртуального класса ( шаблон стратегии ) и извлеките из него.Вы можете использовать конструктор MyButton для размещения экземпляра виртуального класса, чтобы методы MyButton могли получить доступ к реализации real .

Я могу порекомендовать книгу Алана и Джеймса Шаблоны проектирования объяснены - Новый взгляд на объектно-ориентированный дизайн (ISBN-13: 978-0321247148):

alt text

Это отличная книгао имеет-10 * * и -ст решений, включая сцепление и сцепление в объектно-ориентированном дизайне.

2 голосов
/ 03 января 2011

Наследование (или, по крайней мере, публичное наследование) определяет отношение is-a .Является ли ваше окно функциональностью кнопки?Или ваше окно имеет функциональность кнопки?Очевидно, что это последнее, поэтому я предлагаю пойти на композицию (или, возможно, частное наследование - см. Эту статью FAQ ).

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