Комната для дискуссий (пример чат-программы)
Исходный код сервера
Сервер содержит код, обеспечивающий хранение в коллекции имен пользователей, присоединившихся к чату. При уходе участника его имя удаляется из коллекции. Присоединение нового пользователя или уход зарегистрированного приводит к генерации события, обрабатываемого клиентом. Кроме того, в сервере реализованы другие необходимые действия, такие, как объявление делегатов, событий и аргументов событий. В нем также реализованы вспомогательные методы, использующиеся для генерации событий.
//ChatServer.h _gc class ChatEventArg: public EventArgs // класс сборщика мусора ChatEventArg: EventArgs { public: String *pName; ChatEventArg(String *pName) { this › pName = pName; } }; _delegate void JoinHandler( Object *pSender, ChatEventArg *pe); _delegate void QuitHandler( Object *pSender, ChatEventArg *pe); _gc class ChatServer // класс сборщика мусора ChatServer { private: // частный ArrayList *pMembers; String *pChatName; public: _event JoinHandler *pJoin; _event QuitHandler *pQuit; ChatServer(String *pChatName) { pMembers = new ArrayList; this › pChatName = pChatName; } String *ToString () { return pChatName; } protected: // защищенный void OnJoin(ChatEventArg *pe) { if (pJoin!= 0) { pJoin(this, pe); // запустить событие } } void OnQuit(ChatEventArg *pe) { if (pQuit!= 0) { pQuit(this, ре); // запустить событие } } public: void JoinChat(String *pName) { pMembers › Add(pName); // Добавить OnJoin(new ChatEventArg(pName)); } void QuitChat(String *pName) { pMembers › Remove(pName); // Удалить OnQuit(new ChatEventArg(pName)); } void ShowMembers(String *pMsg) { Console:rWriteLine ("– {0} – ", pMsg); lEnumerator *plter = pMembers › GetEnumerator(); while (p!ter › MoveNext()) { String *pMember = dynamic_cast<String *>((p!ter › Current)}; Console::WriteLine(pMember); } } };
Поначалу может показаться, что здесь немалый объем вспомогательного кода, но этот подход намного проще, чем прежний – механизм точек стыковки, – реализованный для событий в СОМ.