|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
01.07.2013, 22:40 | #21 |
Новичок
Джуниор
Регистрация: 30.06.2013
Сообщений: 8
|
Изначально это была учебная работа, которая включала в себя схожие по структуре классы, назовём их Derived. Каждый класс включал в себя ещё класс (библиотеку), назовем Class. В работе активно использовалось агрегирование (композиция).
Пользователю для работы с классами предоставлялся класс-интерфейс, который включал в себя эти самые классы Derived (опять агрегирование). Для того, чтобы класс-интерфейс понимал, какой класс Derived необходим пользователю, в класс-интерфейс передавался указатель на нужный класс, но с типом void и идентификатор для определения типа класса (числа 1, 2, ..). Класс-интерфейс полученный указатель явно приводил к нужному классу Derived, зная идентификатор типа класса. Отсюда имеем класс-интерфейс с полным доступом к классу Derived. При необходимости класс Derived легко и непринужденно обращался к библиотеке Class и всё это происходило внутри класса-интерфейса. Так был достигнут нехилый динамизм. Со временем код рос, число классов Derived увеличивалось и класс-интерфейс приходится модифицировать, но с сохранением имеющегося функционала. Выбор наследования от базового класса упирается в потерю гибкости, потому что присваивание, приведение или копирование Base* = Derived* приводит к срезке и полученный Base* - это уже не тот Derived*. Использование библиотеки boost, что позволяет создавать контейнеры с разными типами классов, пока не рассматривается. Я не большой мастак объяснять, но ... пианист играет, как умеет. Есть ли идеи для решения такой задачи? |
01.07.2013, 23:02 | #22 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
Думаю нужно рассмотреть вариант создания интерфейса, элемент которого имел бы сигнатуру - тип соответсвующего класса для выполнения некой опреации.
Например, char* GetEmployeeAddress(Derived*); Я хочу сказать, что все классы вашей иерархии предоставляют некий функционал. Вы пытаетесь, насколько я понял, предоставить доступ к этому функционалу используя класс-интефейс. Тогда почему бы не определить интерфейс, элементы которого выполняли бы определенные операции С ПОМОЩЬЮ других классов. Хотя, нехорошо, когда один класс указывает всем остальным что им делать... |
01.07.2013, 23:57 | #23 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Цитата:
Это не задача, это метод решение какойто другой задачи. Вопрос в том, какова была изначальная задача - возможно есть лучший вариант решения, чем "универсальный" интерфейс. |
|
02.07.2013, 00:19 | #24 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
И впредь, прежде чем пилить фичу ради фичи, подумать: как он собирается это использовать. И только потом думать о реализации. Это трудно даже назвать ООП головного мозга. Это просто каша. |
|
02.07.2013, 06:36 | #25 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Я уже 2 раза спрашивал как ты собираешься с этим работать. Извлек ты элемент из контейнера и не знаешь что с ним можно делать, а что нельзя и перед тем как с ним работать ты по-любому напишешь что-то типа dynamic_cast, но беда в том, что ты будешь делать это 15 раз и постоянно. |
|
02.07.2013, 10:29 | #26 | |||||
Новичок
Джуниор
Регистрация: 30.06.2013
Сообщений: 8
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
|||||
02.07.2013, 13:44 | #27 | |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
class Interface
{ public: //interface _returnval SomeMethod(Derived*); _returnval SomeMethod(Derived*); //и так далее //... }; Ваш подход Цитата:
Мне кажется, что ни один из квалифицированных разработчиков ПО даже не стал бы смотреть на код, в котором нарушена инкапсуляция. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Получить по ссылке на интерфейс указатель на класс в котором он реализован | 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 |