Как переопределить методы вложенных объектов C ++? - PullRequest
5 голосов
/ 08 апреля 2010

Я не нашел лучшего названия для вопроса. Позвольте мне объяснить это лучше сейчас:

Проект, над которым я работаю, будет подключаться к удаленному серверу, шифровать сеанс и отправлять / получать пакеты данных. Я хотел бы сделать его достаточно модульным, поэтому я подумал, что было бы неплохо использовать 3 разных класса. Это будет:

1) Класс-оболочка сокета с некоторыми виртуальными методами, такими как OnReceivedData () и OnConnected ().

2) Унаследованный класс оболочки сокета, реализующий шифрование данных перед их отправкой и расшифровывающий данные по прибытии.

3) Сам основной объект, который должен переопределять любой из вышеперечисленных классов в зависимости от его необходимости шифроваться или нет, чтобы он мог также получать уведомления о событиях OnReceivedData () и OnConnected () и действовать на его основе .

Итак, проблема в том, КАК я могу заставить мою программу знать, что она должна сначала вызвать событие для объекта шифрования, а затем вызвать это же событие для основного объекта? Поскольку я предполагаю, что если я переопределю оболочку сокета с помощью шифрования, а затем переопределю шифрование с помощью основного объекта, он, вероятно, просто вызовет метод основного объекта (он вызовет OnReceivedData () непосредственно для основного объекта, не проходя через расшифровку сначала объект, верно?).

Это называется множественным наследованием?

Кстати, если вы думаете, что это плохой дизайн проекта, я был бы признателен за любые лучшие подходы. Спасибо, что нашли время, чтобы прочитать это.

Ответы [ 2 ]

4 голосов
/ 08 апреля 2010

Не делайте объект шифрования потомком. Сделайте это декоратором или прокси . Главный объект не должен знать, зашифровывает ли он вещи. Вместо этого у него будет объект передачи данных (класс сокета), который отправляет и получает данные, и если этот объект передачи данных оказывается чем-то, что шифрует данные перед передачей их реальному объекту сокета, пусть будет так. Это не касается основного объекта.

При использовании прокси класс шифрования будет иметь тот же интерфейс, что и объект сокета. Он обернет объект сокета, а главный объект будет общаться с сокетом через объект шифрования. Если вам не нужно шифрование, назначьте объект сокета непосредственно главному объекту и пропустите посредника.

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

Декораторы и прокси описаны в Шаблонах проектирования Фаулера , которые включают примеры на C ++.

2 голосов
/ 08 апреля 2010

Это не называется множественным наследованием (это когда один класс наследует от нескольких суперклассов). Это называется переопределением метода. В вашем «главном» OnReceivedData вы можете явно вызвать «супер» метод, указав его имя, EncryptedBaseClass::OnReceivedData().

Это может стать грязным. Я бы порекомендовал вам поменять владельца и позволить классу шифрования содержать ссылку на класс сокета в соответствии с шаблоном декоратора (имеющим декоратор шифрования). Это решит ваши проблемы с переопределением, в то же время предоставляя вам необходимые функции.

...