Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Dsmover, Вы писали:
D>>Еще маленький вопрос почти по теме. D>>Вот есть класс IParameter. Есть наследники от него. D>>Я хочу в один и тот же обработчик передавать скажем 5 разных наследников (то есть бывает 5 разных сущностей параметров). D>>Как в этом обработчике лучше проверять, какой конкретный пришел параметер:
К>Сперва нужно ответить — ЗАЧЕМ проверять, какой конкретный параметр. К>Можно ли решить задачу с помощью виртуальных функций? Пусть каждый наследник умеет по-своему делать ту задачу, которую ты на него взваливаешь. Выдели эту задачу в отдельную функцию-член интерфейса и дёргай. К>Виртуальные вызовы — точно дешевле и свитча с динамик-кастами, и последовательных динамик-кастов.
К>Вариант со свитчом некрасив потому, что ты задействуешь параллельно сразу два RTTI — штатный (dynamic_cast) и самодельный (GetIdParam). К>Нужны веские основания для того, чтобы писать самодельный RTTI (например, если идентификаторы прописаны в техническом задании, как неотъемлемая часть предметной области; или, когда требуется ABI с другими языками, что-то вроде COM; но тогда не нужен штатный RTTI, пользуйся только самодельным).
Я хочу передавать разные параметры, в одном случае просто число, иногда строка, иногда структура и т.д, смотря что ждет обработчик при каком событии. Сам класс (наследник от IParameter) является в принципе только хранилищем разного рода данных.
Поясню зачем я все это спрашиваю... Идеалогия MFC SendMessage(hWnd, WM_USER + n, (DWORD) &cstring_str, (DWORD) int_value) мне не нравится кривотой и небезопасностью разбора кастами реальных параметров в WndProc(DWORD lParam, wParam).
Хочется использовать какой-то новый безопасный С++-ый подход.