реализация наследования проблема в дизайне FE - PullRequest
0 голосов
/ 15 декабря 2010

Я ничего не знаю о MFC. Но я узнал, что у него есть класс CWnd, который оборачивает вызовы Win32 API. И есть элементы управления - CListBox и такие, которые происходят от CWnd.

Q1: CWnd - это интерфейсный класс. CListBox происходит от класса реализации. Общий совет - избегать этого. Microsoft ошибается или наследование реализации не так уж плохо?

Q2: Этот UML описывает одну проблему, которую мы получили. Любые идеи о том, что делать, приветствуются. Одним из предложений было использование макроса для «внедрения» общего кода реализации. Я поднял вопрос об этом здесь . Баунти истекает сегодня.

РЕДАКТИРОВАТЬ: редактировать диаграмму классов.

Ответы [ 2 ]

2 голосов
/ 15 декабря 2010

Q1.

Нет общего совета, чтобы избежать наследования реализации.Люди делают это постоянно.

С другой стороны, MFC является ярким примером дизайна Just Bad ™ C ++.Это связано с тем, что (1) она очень старая и предварительно стандартная, (2) представляет собой упрощенную версию более похожей на C ++ библиотеки AFX (насколько я помню), которая в то время оказалась слишком «сложной» для программистов.

Итак, подводя итог, ваш Q1 поднимает "ложную дихотомию": нет никакого противоречия между наследованием реализации в порядке, Microsoft ошибочно, MFC является примером в целом плохого дизайна, и любым качеством, которое CListBox has.

Q2.

По сути, вопрос перефразируется: «Это хорошая идея для генерации общего кода для классов с использованием макросов генерации кода?».

Ответ на этот вопрос - нет, как правило, это не очень хорошая идея.

Это абсолютно зло.Хотя это зло может быть наименьшим злом в некоторых случаях, например, при реализации clone, но мы говорим о макросе, выполняющем что-то, что не поддерживается в C ++, а именно общековариантную реализациюфункция-член.Тем не менее, это настолько хороший момент, что большинство жителей SO не понимают этого (я знаю, потому что я поднял это в одном ответе на вопрос, и это было сильно понижено), поэтому я, возможно, не должен поднимать его - достаточно сказать, чтов общем, эй, это зло.

Итак, вы знаете, что вы должны не делать.

Но что касается хорошей альтернативы, хорошо, это зависит отcontext.

И ваш контекст слишком смутно очерчен, чтобы давать какие-либо действительно полезные советы по этому поводу.

Cheers & hth.,

0 голосов
/ 15 декабря 2010

Общий совет не означает, что он подходит для любого конкретного класса. Шутки в сторону. Возможно, было бы лучше наследовать от интерфейсов большую часть времени, но это очень, очень далеко от того, чтобы сказать, что «класс X не должен наследовать реализацию от класса Y для любых X и Y». Вы не можете просто взять пример и сказать, что это плохо. Вы должны понимать весь исходный код.

Не только это, но MFC как библиотека возникла задолго до появления стандарта C ++ и предлагает обходные пути для вещей, которых нет в языке, и тому подобное. Это больше не жизнеспособная библиотека C ++ - например, их реализация CArray<T> использует memcpy для копирования объектов вместо конструктора копирования и явно избыточна благодаря vector.

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