2010-04-07 4 views
5

Ich habe keinen besseren Titel für die Frage gefunden. Lass es mich jetzt besser erklären:Wie überschreiben verschachtelte C++ - Objekte Methoden?

Das Projekt, an dem ich arbeite, wird sich mit einem Remote-Server verbinden, die Sitzung verschlüsseln und Datenpakete senden/empfangen. Ich möchte es modular genug machen, also dachte ich, es wäre schön, 3 verschiedene Klassen zu verwenden. Diese wären:

1) Eine Socket-Wrapper-Klasse mit einigen virtuellen Methoden wie OnReceivedData() und OnConnected().

2) Eine geerbte Klasse des Socket-Wrappers, die die Verschlüsselung von Daten vor dem Senden und Entschlüsseln von Daten bei ihrer Ankunft implementiert.

3) Das Hauptobjekt selbst, das eine der oben genannten Klassen überschreiben sollte, abhängig davon, ob es verschlüsselt werden muss oder nicht, sodass es auch die OnReceivedData() - und OnConnected() -Ereignisbenachrichtigungen empfangen und basierend darauf agieren kann es.

Also ist das Problem, wie mache ich mein Programm zu wissen, dass es zuerst das Ereignis auf dem Verschlüsselungsobjekt aufrufen und dann das gleiche Ereignis auf dem Hauptobjekt aufrufen muss? Weil ich denke, wenn ich den Socket-Wrapper mit der Verschlüsselung überschreibe und dann die Verschlüsselung mit dem Hauptobjekt überschreibe, wird es wahrscheinlich nur die Hauptobjektmethode aufrufen (es würde OnReceivedData() direkt auf dem Hauptobjekt aufrufen und die Entschlüsselung nicht durchlaufen Objekt zuerst, oder?).

Wird dies Mehrfachvererbung genannt?

BTW, wenn Sie denken, dass es ein schlechtes Projektdesign ist, würde ich alle besseren Ansätze schätzen. Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu lesen.

+0

Mein Vorschlag, versuchen Sie Design-Muster, wie ein 'Builder' oder' Factory' Muster. –

Antwort

2

Es wird keine Mehrfachvererbung aufgerufen (dies ist der Fall, wenn eine Klasse von mehreren Superklassen erbt). Es wird als Überschreiben von Methoden bezeichnet. In Ihrem 'main' OnReceivedData können Sie die Methode 'super' explizit aufrufen, indem Sie den Namen EncryptedBaseClass::OnReceivedData() qualifizieren.

Dies kann unordentlich werden. Was ich empfehlen würde ist, dass Sie die Eigentumsrechte invertieren und die Verschlüsselungsklasse einen Verweis auf die Socket-Klasse halten, in Übereinstimmung mit der decorator pattern (mit einem Verschlüsselungsdekorator). Dadurch werden Ihre Override-Probleme gelöst und Sie erhalten die von Ihnen gewünschte Funktionalität.

4

Machen Sie das Verschlüsselungsobjekt nicht zu einem Nachkommen. Machen Sie es zu einem Dekorateur oder Proxy. Das Hauptobjekt sollte nicht wissen müssen, ob es Dinge verschlüsselt. Stattdessen wird es ein Datenübertragungsobjekt (die Socket-Klasse) haben, das Daten sendet und empfängt, und wenn dieses Datenübertragungsobjekt etwas ist, das die Daten verschlüsselt, bevor es sie an das reale Socket-Objekt weitergibt, so sei es. Das ist das Hauptobjekt nicht.

Mit einem Proxy hätte die Verschlüsselungsklasse dieselbe Schnittstelle wie das Socket-Objekt. Es würde wrap das Socket-Objekt, und das Hauptobjekt würde über das Verschlüsselungsobjekt mit dem Socket sprechen. Wenn Sie keine Verschlüsselung wünschen, weisen Sie das Socket-Objekt direkt dem Hauptobjekt zu und überspringen Sie den Mittelmann.

Mit einem Decorator würde das Hauptobjekt direkt mit dem Socket-Objekt kommunizieren, aber das Socket-Objekt würde alles durch das Verschlüsselungsobjekt laufen lassen, bevor es entlang der Leitung gesendet wird. Wenn kein Decorator gesetzt ist, würde das Socket-Objekt stattdessen die Daten direkt senden.

Dekoratoren und Proxies sind in Fowlers Design Patterns enthalten, die Beispiele in C++ enthält.

Verwandte Themen