Возвращая сам объект base
, вы отбрасываете любую ссылку на него, начиная с derived
, а затем повышая (и копируя).
Так эффективно, что вы ищете, не сработает.
Если вам действительно «нужно это вернуть объект», я рекомендую тонкую оболочку
struct karls_return_object {
// ... stuff ...
Base *b;
};
На вопрос просто отвечают путем распознавания, что наследование моделирует отношения "ISA", в то время как отношения моделей a "HAS - A" членства.
, Какой корректен? Это - Ваш ответ.
Мне не нравится ни один. Что происходит, когда кто-то - и участник и сотрудник?
Я не думаю, что состав всегда лучше, чем наследование (просто обычно). Если Сотрудник и участник действительно являются Пользователями, и они являются взаимоисключающими, то первый дизайн лучше. Рассмотрите сценарий, где необходимо получить доступ к UserName Сотрудника. Используя второй дизайн Вы имели бы:
myEmployee.UserInfo.UserName
, который плох (закон Demeter), таким образом, Вы осуществили бы рефакторинг к:
myEmployee.UserName
, который требует, чтобы маленький метод на Сотруднике делегировал к Пользовательскому объекту. Всего из которого избегает первый дизайн.
Спросите себя следующее:
В целом, стремитесь смоделировать действительность, которую Ваша программа моделирует при ограничениях сложности кода и требуемой эффективности.
Реальные вопросы:
Они могут быть тремя абсолютно несвязанными объектами или нет, и это определит, будет ли Ваш первый или второй дизайн работать, или если другой совершенно другой дизайн в порядке.
Утверждение Вашего требования/спецификации могло бы помочь достигнуть 'лучшего дизайна'.
Ваш вопрос также 'subject-to-reader-interpretation' в данный момент.
Деликатный вопрос, хотя избежать отвлекающих факторов приблизительно право и неправильный , я рассмотрел бы просьбу о за и против каждого подхода - я думаю, что это - то, под чем Вы подразумевали, который лучше или хуже и почему. Так или иначе....
Профессионалы:
Недостатки:
:
Недостатки:
Списки как они + вопросы , Jon Limjap упомянутый поможет Вам принять решения и начать - затем можно найти, каковы право ответы должны были быть ;-)
Никакой не хорош. Слишком много изменяемого состояния. Вы не должны мочь создать экземпляр класса, который находится в недопустимом или частично инициализированном состоянии.
Тем не менее второй лучше, потому что он способствует составу по наследованию.
Вот сценарий, о котором необходимо думать:
Состав (2-й пример) предпочтителен, если тот же Пользователь может быть и Сотрудником и участником. Почему? Поскольку для двух экземпляров (Сотрудник и участник), которые представляют того же Пользователя, если Пользовательские данные изменяются, Вы не должны обновлять их в двух местах. Только Пользовательский экземпляр содержит всю информацию о Пользователе, и только это должно быть обновлено. И начиная с классы Сотрудника и начиная с участника содержат тот же Пользовательский экземпляр, они будут автоматически оба содержать обновленную информацию.