Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2013, 22:40   #21
m_nuhop
Новичок
Джуниор
 
Регистрация: 30.06.2013
Сообщений: 8
По умолчанию

Изначально это была учебная работа, которая включала в себя схожие по структуре классы, назовём их Derived. Каждый класс включал в себя ещё класс (библиотеку), назовем Class. В работе активно использовалось агрегирование (композиция).
Пользователю для работы с классами предоставлялся класс-интерфейс, который включал в себя эти самые классы Derived (опять агрегирование). Для того, чтобы класс-интерфейс понимал, какой класс Derived необходим пользователю, в класс-интерфейс передавался указатель на нужный класс, но с типом void и идентификатор для определения типа класса (числа 1, 2, ..). Класс-интерфейс полученный указатель явно приводил к нужному классу Derived, зная идентификатор типа класса. Отсюда имеем класс-интерфейс с полным доступом к классу Derived. При необходимости класс Derived легко и непринужденно обращался к библиотеке Class и всё это происходило внутри класса-интерфейса. Так был достигнут нехилый динамизм.

Со временем код рос, число классов Derived увеличивалось и класс-интерфейс приходится модифицировать, но с сохранением имеющегося функционала.

Выбор наследования от базового класса упирается в потерю гибкости, потому что присваивание, приведение или копирование Base* = Derived* приводит к срезке и полученный Base* - это уже не тот Derived*.
Использование библиотеки boost, что позволяет создавать контейнеры с разными типами классов, пока не рассматривается.

Я не большой мастак объяснять, но ... пианист играет, как умеет.
Есть ли идеи для решения такой задачи?
m_nuhop вне форума Ответить с цитированием
Старый 01.07.2013, 23:02   #22
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Думаю нужно рассмотреть вариант создания интерфейса, элемент которого имел бы сигнатуру - тип соответсвующего класса для выполнения некой опреации.
Например, char* GetEmployeeAddress(Derived*);
Я хочу сказать, что все классы вашей иерархии предоставляют некий функционал.
Вы пытаетесь, насколько я понял, предоставить доступ к этому функционалу используя класс-интефейс.
Тогда почему бы не определить интерфейс, элементы которого выполняли бы определенные операции С ПОМОЩЬЮ других классов.


Хотя, нехорошо, когда один класс указывает всем остальным что им делать...
Igor95 вне форума Ответить с цитированием
Старый 01.07.2013, 23:57   #23
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от m_nuhop Посмотреть сообщение
Выбор наследования от базового класса упирается в потерю гибкости, потому что присваивание, приведение или копирование Base* = Derived* приводит к срезке и полученный Base* - это уже не тот Derived*.
Потеря гибкости и так уже есть - все ограничено методами внешнего "универсального" класса. В чем тогда разница, если этот "универсальный" класс будет базовым интерфейсом для всех Derived классов?

Цитата:
Сообщение от m_nuhop Посмотреть сообщение
Есть ли идеи для решения такой задачи?
Это не задача, это метод решение какойто другой задачи. Вопрос в том, какова была изначальная задача - возможно есть лучший вариант решения, чем "универсальный" интерфейс.
waleri вне форума Ответить с цитированием
Старый 02.07.2013, 00:19   #24
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от m_nuhop Посмотреть сообщение
библиотеке Class и всё это происходило внутри класса-интерфейса. Так был достигнут нехилый динамизм.
Говнокод. Автору кода - выбросить его в мусорку.
И впредь, прежде чем пилить фичу ради фичи, подумать: как он собирается это использовать. И только потом думать о реализации.

Это трудно даже назвать ООП головного мозга. Это просто каша.
_Bers вне форума Ответить с цитированием
Старый 02.07.2013, 06:36   #25
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Использование библиотеки boost, что позволяет создавать контейнеры с разными типами классов, пока не рассматривается.
Да что тебе даст контейнер с разными типами объектов?
Я уже 2 раза спрашивал как ты собираешься с этим работать.
Извлек ты элемент из контейнера и не знаешь что с ним можно делать, а что нельзя и перед тем как с ним работать ты по-любому напишешь что-то типа dynamic_cast, но беда в том, что ты будешь делать это 15 раз и постоянно.
rrrFer вне форума Ответить с цитированием
Старый 02.07.2013, 10:29   #26
m_nuhop
Новичок
Джуниор
 
Регистрация: 30.06.2013
Сообщений: 8
По умолчанию

Цитата:
Думаю нужно рассмотреть вариант создания интерфейса, элемент которого имел бы сигнатуру - тип соответсвующего класса для выполнения некой опреации.
Например, char* GetEmployeeAddress(Derived*);
Можно ли здесь остановиться поподробнее? Можно ли получить детали реализации?

Цитата:
Я хочу сказать, что все классы вашей иерархии предоставляют некий функционал.
Да, именно так. Получаем множество разных функционалов.

Цитата:
Вы пытаетесь, насколько я понял, предоставить доступ к этому функционалу используя класс-интефейс.
Да, класс-интефейс - это некий контроль доступа к разным функционалам.

Цитата:
Тогда почему бы не определить интерфейс, элементы которого выполняли бы определенные операции С ПОМОЩЬЮ других классов.
Я не знаю, как это сделать. Можно ли получить детали реализации?

Цитата:
Хотя, нехорошо, когда один класс указывает всем остальным что им делать...
Мир несовершенен. Допущенные и упомянутые здесь нарушения ООП и т.д. были сделаны умышленно, потому что так мне удобнее.
m_nuhop вне форума Ответить с цитированием
Старый 02.07.2013, 13:44   #27
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

class Interface
{
public:
//interface
_returnval SomeMethod(Derived*);
_returnval SomeMethod(Derived*);
//и так далее
//...
};
Ваш подход
Цитата:
Мир несовершенен. Допущенные и упомянутые здесь нарушения ООП и т.д. были сделаны умышленно, потому что так мне удобнее.
вообще не соответсвует принципам ООП, задача которых, "сделать мир (или программу) гибкой, корректной и совершенной". Нарушая принципы ООП вы создадите неудобочитаемый код + некорректно работающую программу, которую, к тому же, сложно поддерживать.

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


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить по ссылке на интерфейс указатель на класс в котором он реализован LISTAT Общие вопросы Delphi 9 24.01.2013 12:06
Cоздать класс жидкость. определить конструкторы деструкторы и функцию печати. создать публик производный класс. (С++) Динар Габбасов Помощь студентам 0 28.05.2012 18:44
Добавить класс в проект2,похожий на класс из проекта1!оба проекта есть! xeops C# (си шарп) 0 15.05.2012 20:31
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
разработать интерфейс для дисков - интерфейс програмный Notformal Помощь студентам 0 01.11.2011 22:52