2010-04-07 5 views
5

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

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

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

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

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

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

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

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

+0

Мое предложение, попробуйте использовать шаблоны проектирования, такие как шаблон 'Builder' или' Factory'. –

ответ

2

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

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

4

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

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

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

Декораторы и прокси-серверы покрыты Fauler's Шаблоны проектирования, который включает примеры на C++.

Смежные вопросы