Здравствуйте, zelenprog, Вы писали:
SVZ>>Ну раз нет возможности использовать полиформизм на уровне кода, значит придётся использовать полиморфизм на уровне данных.
SVZ>>В качестве примера можно подсмотреть стек TCP, виндовый WinAPI — структуры переменного размера, в начале размер и тип данных. Внутри обработчика анализ заголовка и передача по цепочке. Т.е. в какой-то точке программы будут собраны все обработчики.
Z>А можно простой пример?
Z>Чтобы было понятнее?
WinAPI:
https://learn.microsoft.com/en-us/windows/win32/controls/lvn-getdispinfo
Для множества уведомлений set/get используется единая схема.
Шлётся сообщение WM_NOTIFY, в качестве параметра — указатель на структуру с данными.
Все структуры имеют одинаковую структуру:
typedef struct tagNMLVFINDITEMA {
NMHDR hdr;
int iStart;
LVFINDINFOA lvfi;
} NMLVFINDITEMA, *LPNMLVFINDITEMA;
typedef struct tagLVDISPINFOW {
NMHDR hdr;
LVITEMW item;
} NMLVDISPINFOW;
и т.д.
Первым идёт заголовок NMHDR, в нём лежит код уведомления.
В зависимости от кода уведомления указатель на void кастится к нужной структуре.
Т.е. все твои отправители уведомлений используют одну и ту же функцию для отправки сообщений.
Если концепция указателей в твоём языке отсутствует, то массив байт создать можно? В этом случае, чтобы отправить уведомление надо выделить блок памяти нужного размера, сериализовать в него свою структуру с данными, массив отправить в диспетчер. Диспетчер десериализует заголовок, подсмотрит тип сообщения и вызовет нужную функцию, которая уже десериализует структуру целиком и обработает уведомление.
Т.е. тут у тебя диспетчер знает о всех обработчиках, но зато остальные части приложения знают только о диспетчере.
в Си все эти преобразования происходят без копирования памяти. А в твоём случае —
SVZ>>Если есть доступ к ОСи (надеюсь, язык не совершенно оторван от реалий), то можно использовать системозависимые механизмы для обмена данными, выше камрады об этом упомянули.
Z>Через файлы обмен будет очень медленным — это самый крайний вариант.
А через сокет? Работа с localhost (наверное в 99% операционок) реализована через память (внутри драйвера), без обращения к железу.