Как переопределить вложенные методы объектов C++?

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

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

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

2) Наследованный класс обертки сокета, реализовывая шифрование данных, прежде чем это будет отправлено и данные дешифрования по его прибытию.

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

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

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

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

5
задан Edward Silva 7 April 2010 в 20:33
поделиться

2 ответа

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

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

2
ответ дан 14 December 2019 в 13:31
поделиться

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

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

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

Декораторы и прокси описаны в Design Patterns Фаулера, который включает примеры на C ++.

4
ответ дан 14 December 2019 в 13:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: