Interfacce duali multiple
È possibile combinare i vantaggi di un'interfaccia doppia ( ovvero la flessibilità del binding sia della tabella virtuale che del binding tardivo, rendendo quindi la classe disponibile per i linguaggi di scripting e C++) con le tecniche di ereditarietà multipla.
Sebbene sia possibile esporre più interfacce duali su un singolo oggetto COM, non è consigliabile. Se sono presenti più interfacce duali, deve essere esposta una IDispatch
sola interfaccia. Le tecniche disponibili per garantire che questo sia il caso comportano sanzioni come la perdita di funzione o una maggiore complessità del codice. Lo sviluppatore che prende in considerazione questo approccio deve valutare attentamente i vantaggi e gli svantaggi.
È possibile esporre più interfacce duali su un singolo oggetto derivando da due o più specializzazioni di IDispatchImpl
. Tuttavia, se si consente ai client di eseguire query per l'interfaccia IDispatch
, sarà necessario usare la macro COM_INTERFACE_ENTRY2 (o COM_INTERFACE_ENTRY_IID)) per specificare la classe di base da usare per l'implementazione di IDispatch
.
COM_INTERFACE_ENTRY2(IDispatch, IMyDualInterface)
Poiché viene esposta una IDispatch
sola interfaccia, i client che possono accedere solo agli oggetti tramite l'interfaccia IDispatch
non potranno accedere ai metodi o alle proprietà in qualsiasi altra interfaccia.
ATL non fornisce alcun supporto per la combinazione di più interfacce duali in una singola implementazione di IDispatch
. Esistono tuttavia diversi approcci noti per combinare manualmente le interfacce, ad esempio la creazione di una classe basata su modelli che contiene un'unione delle interfacce separate IDispatch
, la creazione di un nuovo oggetto per eseguire la QueryInterface
funzione o l'uso di un'implementazione basata su typeinfo di oggetti annidati per creare l'interfaccia IDispatch
.
Questi approcci presentano problemi con potenziali conflitti di spazio dei nomi, nonché complessità e manutenibilità del codice. Non è consigliabile creare più interfacce duali.