class CServer
{
public:
CServer();
~CServer();
class IEventHandler
{
virtual void OnAccept(PCLIENT_INFO pclient) = 0;
virtual void OnDisconnect(PCLIENT_INFO pclient) = 0;
virtual int OnRead(PCLIENT_INFO pclient, uchar* pinbuf,
ulong inbufsize, uchar** poutbuf, ulong* poutbufsize) = 0;
virtual int OnIdle(PCLIENT_INFO pclient) = 0;
virtual void OnSend(PCLIENT_INFO pclient) = 0;
friend class CServer;
// Дальше всё как у тебя, ноprivate:
IEventHandler *m_pevent;
};
Ну а CEventHandler выводишь из IEventHandler, ну и реализацию методов объявляешь в private секции...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Виртуальное наследование, что будет в таком случае...?
Мне необходимо "упрятать" CEventHandler в CRemoteUser ...
Дак вот вопросы..
1. Что будет если я сделаю наследование не так: class CRemoteUser : public CEventHandler, а class CRemoteUser : private CEventHandler и переопределю в private секции CRemoteUser OnAccept, OnDisconnect и т.д.?
2. Если я все так и оставлю в классе CRemoteUser в секции public OnAccept, OnDisconnect и т.д., а изменю только class CRemoteUser : private CEventHandler... какие методы будут вызываться в данном случае (public или private)?
Спасибо!
Re: Виртуальное наследование, что будет в таком случае...?
Здравствуйте, Srv, Вы писали:
Srv>Добрый день! Srv>Есть класс
Srv>Мне необходимо "упрятать" CEventHandler в CRemoteUser ... Srv>Дак вот вопросы.. Srv>1. Что будет если я сделаю наследование не так: class CRemoteUser : public CEventHandler, а class CRemoteUser : private CEventHandler и переопределю в private секции CRemoteUser OnAccept, OnDisconnect и т.д.? Srv>2. Если я все так и оставлю в классе CRemoteUser в секции public OnAccept, OnDisconnect и т.д., а изменю только class CRemoteUser : private CEventHandler... какие методы будут вызываться в данном случае (public или private)?
Srv>Спасибо!
а что значит — "упрятать" ?
по вопросам —
struct base
{
public :
virtual void virt_method() { printf("base::virt_method()\n"); }
};
struct s1 : public base
{
public :
virtual void virt_method() { printf("s1::virt_method()\n"); }
};
struct s2 : private base
{
public :
virtual void virt_method() { printf("s2::virt_method()\n"); }
};
struct s3 : public base
{
private :
virtual void virt_method() { printf("s3::virt_method()\n"); }
};
//...
base * ptr = NULL;
base b;
s1 s1_;
s2 s2_;
s3 s3_;
ptr = &b;
ptr->virt_method(); // "base::virt_method()"
ptr = &s1_;
s1_.virt_method(); // "s1::virt_method()"
ptr->virt_method(); // "s1::virt_method()"
ptr = &s2_; /* нет доступа к предку */
s2_.virt_method(); // "s2::virt_method()"
ptr->virt_method();
ptr = &s3_;
s3_.virt_method(); /* нет доступа к методу самого класса */
ptr->virt_method(); // "s3::virt_method()"
Re[2]: Виртуальное наследование, что будет в таком случае...
Значит что кроме как этого класса (CRemoteUser) и класса что вызывает методы CEventHandler (OnAccept, OnDisconnect и т.д.) ни кто не смог обратиться к методам CEventHandler.
Re[3]: Виртуальное наследование, что будет в таком случае...
Здравствуйте, Srv, Вы писали:
Srv>Значит что кроме как этого класса (CRemoteUser) и класса что вызывает методы CEventHandler (OnAccept, OnDisconnect и т.д.) ни кто не смог обратиться к методам CEventHandler.
1) Чтобы у твоего наследника нельзя было звать методы интерфейса, объяви их в наследнике, как private
2) Чтобы наследник нельзя было привести к базе, используй private базу. Но тебе надо понять кто и когда сможет выполнить этопреобразование, или откуда-то ещё (например благодаря саморегистрации базы) получить указатель на базу.
3) Если ты хочешь чтобы у базы никто, кроме выделенных каких-то пользователей не позвал методы, то надо использовать friend классы видимо, хотя, ИМХО, лучше описать задачу поподробнее, а то какая-то нужда подозрительная.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Виртуальное наследование, что будет в таком случае...
Здравствуйте, Erop, Вы писали:
E>3) Если ты хочешь чтобы у базы никто, кроме выделенных каких-то пользователей не позвал методы, то надо использовать friend классы видимо, хотя, ИМХО, лучше описать задачу поподробнее, а то какая-то нужда подозрительная.
Который и вызывает переопределенные методы в CRemoteUser и "сигналит" ему о тех или иных событиях. Дак вот кроме него ни кто не должен вызывать эти переопределенные методы в CRemoteUser (OnAccept, OnDisconnect...).
E>Ну а CEventHandler выводишь из IEventHandler, ну и реализацию методов объявляешь в private секции...
Но намного прямее будет, если ты разработаешь интерфейс имеющий самостоятельную семантику, то есть не привязанный непосредственно к CServer, и будешь публиковать этот интерфейс и использовать так или сяк, например, в том числе, и в сервере
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Виртуальное наследование, что будет в таком случае...
Здравствуйте, Srv, Вы писали:
Srv>Я сделал так, насколько это правильно?
Ну более или менее, но вторйо путь всё равно лучше, на самом деле.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Виртуальное наследование, что будет в таком случае...
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Srv, Вы писали:
Srv>>Я сделал так, насколько это правильно? E>Ну более или менее, но вторйо путь всё равно лучше, на самом деле.
А я не сильно обнаглею если спрошу как примерно это сделать, а то не совсем понятно?
Ну думаешь какой бы мог быть интерфейс, если бы сервер был не один, а три разных. Чтобы от него абстрагироваться, описываешь его, в своём хендлере реализуешь, а при регистрации хендлера в сервере отдаёшь туда интерфейс.
Плюсы такие что нет нужды привязываться как-то к конкретному серверу. И Серверу нет нужды привязываться к конкретному хендлеру. Всё что их связывает -- это хорошо формализованый и продуманный интерфейс. Соответсвенно легко менять и сервер и хендлер...
Кстати
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском