Поделиться через


Явное переопределение элемента интерфейса

В Visual C++ 2010 синтаксис для объявления переопределения элемента интерфейса в классе изменился по сравнению с управляемыми расширениями для C++.

Часто требуется предоставить два экземпляра элемента интерфейса в классе, который реализует этот интерфейс. Первый используется при управлении объектами классов с помощью дескриптора интерфейса, а второй — при использовании объектов класса через интерфейс классов. Пример:

public __gc class R : public ICloneable {
   // to be used through ICloneable
   Object* ICloneable::Clone();

   // to be used through an R
   R* Clone();
};

В управляемых расширениях это можно выполнить, предоставив явное объявление метода интерфейса и включив в имя метода имя интерфейса. Имя экземпляра конкретного класса не указывается. Это снижает необходимость образовывать производный тип для возвращаемого значения Clone (в данном примере) в случае явного вызова с помощью экземпляра R.

В новом синтаксисе используется новый механизм переопределения, заменивший синтаксис, который использовался в управляемых расширениях. Этот пример может быть переписан следующим образом:

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.

См. также

Ссылки

Explicit Overrides

Основные понятия

Объявления членов в пределах класса или интерфейса