接口成员的显式重写
更新:2007 年 11 月
声明显式重写类中接口成员的语法已从 Managed Extensions for C++ 更改为 Visual C++ 2008。
经常需要在实现接口的类中提供两个接口成员的实例 — 其中一个在通过接口句柄操作类对象时使用,而另一个在通过类接口使用类对象时使用。例如:
public __gc class R : public ICloneable {
// to be used through ICloneable
Object* ICloneable::Clone();
// to be used through an R
R* Clone();
};
在托管扩展中,通过用接口名称限定的方法名称来提供接口方法的显式声明来实现此目的。未限定特定的类的实例。在此示例中,当通过 R 的实例显式调用 Clone 时,将消除向下转换其返回值的需要。
在新的语法中,引入了一个通用重写机制代替托管扩展语法。将重写我们的示例,如下所示:
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();
};
此版本要求在类中为正显式重写的接口成员赋予一个唯一名称。在此,我提供了一个有些笨拙的 InterfaceClone 的名称。行为仍然相同 — 通过 ICloneable 接口的调用将调用重新命名的 InterfaceClone,,而通过类型 R 的一个对象的调用将调用第二个 Clone 实例。