interface class
(C++/CLI и C++/CX)
Объявляет интерфейс. Дополнительные сведения об собственных интерфейсах см. в статье __interface
.
Все среды выполнения
Синтаксис
interface_access interface class name : inherit_access base_interface {};
interface_access interface struct name : inherit_access base_interface {};
Параметры
interface_access
Доступность интерфейса за пределами данной сборки. Возможные значения: public
и private
. Значение по умолчанию — private
. Вложенные интерфейсы не могут иметь interface_access
описателя.
name
Имя интерфейса.
inherit_access
Доступность base_interface
. Единственным допустимым специальным возможностями базового интерфейса является public
(по умолчанию).
base_interface
(Необязательно) Базовый интерфейс для интерфейса name
.
Замечания
interface struct
эквивалентна interface class
.
Интерфейс может содержать объявления для функций, событий и свойств. Все элементы интерфейса имеют специальные возможности уровня public. Интерфейс также может содержать статические элементы данных, функции, события и свойства. Статические элементы должны быть определены в интерфейсе.
Интерфейс определяет, каким образом можно реализовать класс. Интерфейс не является классом и классами, которые могут реализовывать только интерфейсы. Если класс определяет функцию, представленную в интерфейсе, функция реализовывается без переопределения. Поэтому поиск имен не включает элементы интерфейса.
struct
Объект или class
производный от интерфейса должен реализовать все члены интерфейса. При реализации интерфейса name
необходимо также реализовать интерфейсы в списке base_interface
.
Дополнительные сведения см. в разделе:
Сведения о других типах среды CLR см. в статье о классах и структурах.
Во время компиляции можно определить, является ли тип интерфейсом, с помощью __is_interface_class(type)
. Дополнительные сведения см. в разделе "Поддержка компилятора" для признаков типов.
В среде разработки вы можете получить справку F1 по этим ключевым словам, выделите ключевое слово (например, interface class
) и нажав клавишу F1.
Среда выполнения Windows
Замечания
(Отсутствуют комментарии для этой возможности языка, которая применяется только в среде выполнения Windows).
Требования
Параметр компилятора: /ZW
Среда CLR
Замечания
(Отсутствуют комментарии для этой возможности языка, которая применяется только в среде CLR).
Требования
Параметр компилятора: /clr
Примеры
В следующем примере кода демонстрируется, как интерфейс может определять поведение функции часов.
// mcppv2_interface_class.cpp
// compile with: /clr
using namespace System;
public delegate void ClickEventHandler(int, double);
// define interface with nested interface
public interface class Interface_A {
void Function_1();
interface class Interface_Nested_A {
void Function_2();
};
};
// interface with a base interface
public interface class Interface_B : Interface_A {
property int Property_Block;
event ClickEventHandler^ OnClick;
static void Function_3() { Console::WriteLine("in Function_3"); }
};
// implement nested interface
public ref class MyClass : public Interface_A::Interface_Nested_A {
public:
virtual void Function_2() { Console::WriteLine("in Function_2"); }
};
// implement interface and base interface
public ref class MyClass2 : public Interface_B {
private:
int MyInt;
public:
// implement non-static function
virtual void Function_1() { Console::WriteLine("in Function_1"); }
// implement property
property int Property_Block {
virtual int get() { return MyInt; }
virtual void set(int value) { MyInt = value; }
}
// implement event
virtual event ClickEventHandler^ OnClick;
void FireEvents() {
OnClick(7, 3.14159);
}
};
// class that defines method called when event occurs
ref class EventReceiver {
public:
void OnMyClick(int i, double d) {
Console::WriteLine("OnClick: {0}, {1}", i, d);
}
};
int main() {
// call static function in an interface
Interface_B::Function_3();
// instantiate class that implements nested interface
MyClass ^ x = gcnew MyClass;
x->Function_2();
// instantiate class that implements interface with base interface
MyClass2 ^ y = gcnew MyClass2;
y->Function_1();
y->Property_Block = 8;
Console::WriteLine(y->Property_Block);
EventReceiver^ MyEventReceiver = gcnew EventReceiver();
// hook handler to event
y->OnClick += gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
// invoke events
y->FireEvents();
// unhook handler to event
y->OnClick -= gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
// call implemented function via interface handle
Interface_A^ hi = gcnew MyClass2();
hi->Function_1();
}
in Function_3
in Function_2
in Function_1
8
OnClick: 7, 3.14159
in Function_1
В следующем примере кода показаны два способа реализации функций с одной и той же сигнатурой, объявленной в нескольких интерфейсах, и где эти интерфейсы используются классом.
// mcppv2_interface_class_2.cpp
// compile with: /clr /c
interface class I {
void Test();
void Test2();
};
interface class J : I {
void Test();
void Test2();
};
ref struct R : I, J {
// satisfies the requirement to implement Test in both interfaces
virtual void Test() {}
// implement both interface functions with explicit overrides
virtual void A() = I::Test2 {}
virtual void B() = J::Test2 {}
};