Override esplicito di un membro di interfaccia
La sintassi per la dichiarazione di un override esplicito di un membro di interfaccia all'interno di una classe è stata modificata dalle estensioni gestite per C++ in Visual C++ 2010.
Spesso si desidera fornire due istanze di un membro di interfaccia all'interno di una classe che implementa l'interfaccia: un'istanza viene utilizzata in caso di modifica degli oggetti della classe tramite un handle di interfaccia e un'istanza viene utilizzata in caso di utilizzo degli oggetti della classe tramite l'interfaccia della classe. Di seguito è riportato un esempio:
public __gc class R : public ICloneable {
// to be used through ICloneable
Object* ICloneable::Clone();
// to be used through an R
R* Clone();
};
Nelle estensioni gestite, a tale scopo viene fornita una dichiarazione esplicita del metodo di interfaccia, con il nome del metodo qualificato con il nome dell'interfaccia. L'istanza specifica della classe non è qualificata. Nell'esempio, in caso di chiamata esplicita tramite un'istanza di R non è pertanto necessario eseguire il downcast del valore restituito di Clone.
Nella nuova sintassi, è stato introdotto un meccanismo di override generale in sostituzione della sintassi delle estensioni gestite. È possibile riscrivere l'esempio come segue:
public ref class R : public ICloneable {
public:
// to be used through ICloneable
virtual Object^ InterfaceClone() = ICloneable::Clone;
// to be used through an R
virtual R^ Clone();
};
Con questa revisione è necessario che al membro di interfaccia sottoposto a override esplicito venga assegnato un nome univoco all'interno della classe. In questo caso, è stato specificato il nome InterfaceClone. Il comportamento rimane invariato: una chiamata tramite l'interfaccia ICloneable richiama il membro InterfaceClone, rinominato, mentre una chiamata tramite un oggetto di tipo R richiama la seconda istanza di Clone.