2010-04-07 12 views
5

Non ho trovato un titolo migliore per la domanda. Lasciatemi spiegare meglio ora:Come sovrascrivere i metodi di oggetti C++ annidati?

Il progetto su cui sto lavorando si collegherà a un server remoto, crittograferà la sessione e invierà/riceverà i pacchetti di dati. Mi piacerebbe renderlo abbastanza modulare, quindi ho pensato che sarebbe stato carino usare 3 classi distinte. Questi sarebbero:

1) Una classe wrapper socket con alcuni metodi virtuali come OnReceivedData() e OnConnected().

2) Una classe ereditata del wrapper socket, che implementa la crittografia dei dati prima che venga inviata e decrittando i dati al suo arrivo.

3) L'oggetto principale stesso, che dovrebbe sostituire una qualsiasi delle classi precedenti in base alla sua necessità di essere crittografato o meno, così potrebbe ricevere anche la notifica di eventi OnReceivedData() e OnConnected() e agire sulla base di esso.

Quindi il problema è: come faccio a sapere che il mio programma deve prima chiamare l'evento sull'oggetto di crittografia e quindi chiamare lo stesso evento sull'oggetto principale? Perché suppongo che se sovrascrivo il socket wraper con la crittografia e quindi eseguo l'override della crittografia con l'oggetto principale, probabilmente chiamerà semplicemente il metodo dell'oggetto principale (chiamerebbe OnReceivedData() direttamente sull'oggetto principale, non passando attraverso la decrittografia prima l'oggetto, vero?).

Si tratta di ereditarietà multipla?

BTW se pensi che sia un cattivo progetto, apprezzerei qualsiasi approccio migliore. Grazie per aver dedicato del tempo a leggere questo.

+0

Il mio suggerimento, provare a utilizzare modelli di progettazione, come ad esempio 'Builder' o' Factory'. –

risposta

2

Non è chiamato ereditarietà multipla (questo è quando una classe eredita da più super classi). Si chiama metodo prioritario. Nel tuo 'principale' OnReceivedData, puoi chiamare esplicitamente il metodo 'super' qualificando il suo nome, EncryptedBaseClass::OnReceivedData().

Questo può diventare complicato. Quello che vorrei raccomandare è di invertire la proprietà e lasciare che la classe di crittografia abbia un riferimento alla classe socket, in linea con lo decorator pattern (Avere un decoratore di crittografia). Questo risolverà i tuoi problemi di override pur continuando a fornirti le funzionalità che cerchi.

4

Non rendere l'oggetto di crittografia un discendente. Rendilo un decoratore o proxy. L'oggetto principale non dovrebbe avere bisogno di sapere se sta crittografando le cose. Invece, avrà un oggetto di trasferimento dati (la classe socket) che invia e riceve dati, e se quell'oggetto di trasferimento dati è qualcosa che crittografa i dati prima di passarli al vero oggetto socket, così sia. Questo non riguarda l'oggetto principale.

Con un proxy, la classe di crittografia avrebbe la stessa interfaccia dell'oggetto socket. Sarebbe avvolgere l'oggetto socket e l'oggetto principale avrebbe parlato con il socket tramite l'oggetto di crittografia. Se non si desidera la crittografia, assegnare direttamente l'oggetto socket all'oggetto principale e saltare l'intermediario.

Con un decoratore, l'oggetto principale dovrebbe parlare direttamente all'oggetto socket, ma l'oggetto socket eseguirà tutto attraverso l'oggetto di crittografia prima di inviarlo lungo il filo. Se non esiste un set di decoratori, l'oggetto socket invierà i dati direttamente.

Decoratori e proxy sono inclusi nei modelli di progettazione di Fowler, che include esempi in C++.

Problemi correlati