Иллюстрированный самоучитель по Architecture .NET

Комната для дискуссий (пример чат-программы)

Исходный код сервера

Сервер содержит код, обеспечивающий хранение в коллекции имен пользователей, присоединившихся к чату. При уходе участника его имя удаляется из коллекции. Присоединение нового пользователя или уход зарегистрированного приводит к генерации события, обрабатываемого клиентом. Кроме того, в сервере реализованы другие необходимые действия, такие, как объявление делегатов, событий и аргументов событий. В нем также реализованы вспомогательные методы, использующиеся для генерации событий.

//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);
}
}
};

Поначалу может показаться, что здесь немалый объем вспомогательного кода, но этот подход намного проще, чем прежний – механизм точек стыковки, – реализованный для событий в СОМ.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.