Explicitní přepsání člena rozhraní
Syntaxe pro deklarování explicitního přepsání člene rozhraní v rámci třídy se změnila ze způsobů ze Správce rozšíření pro C++ na způsob z Visual C++ 2010.
Často byste chtěli poskytnout dvě instance člena rozhraní v rámci třídy, která implementuje rozhraní – jedna, která se používá, když jsou objekty třídy manipulovány prostřednictvím popisovače rozhraní a druhá, která se používá, když se objekty třídy používají prostřednictvím rozhraní třídy. Příklad:
public __gc class R : public ICloneable {
// to be used through ICloneable
Object* ICloneable::Clone();
// to be used through an R
R* Clone();
};
Ve spravovaném rozšíření toto provedeme, pokud poskytneme explicitní deklaraci metody rozhraní s názvem metody, která je kvalifikovaná na základě názvu rozhraní. Instance specifická pro třídu je neúplná. Tím je odstraněna nutnost downcast návratové hodnoty Clone, v tomto příkladu při explicitním volání prostřednictvím instance R.
V nové syntaxi byl představen obecný mechanismus přepsání, který nahradí syntaxi ze spravovaného rozšíření. Náš příklad by byl přepsán takto:
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();
};
Tato revize vyžaduje, aby byl člen rozhraní explicitně přepsán tím, že se mu přidělí jedinečný název v rámci třídy. Zde jsme zadali nevhodný název pro InterfaceClone. Chování je stále stejné – vyvolání prostřednictvím rozhraní ICloneable vyvolá přejmenované InterfaceClone, zatímco volání prostřednictvím objektu typu R vyvolá druhou instanci Clone.