interface class
(C++/CLI i C++/CX)
Deklaruje interfejs. Aby uzyskać informacje na temat interfejsów natywnych, zobacz __interface
.
Wszystkie środowiska uruchomieniowe
Składnia
interface_access interface class name : inherit_access base_interface {};
interface_access interface struct name : inherit_access base_interface {};
Parametry
interface_access
Ułatwienia dostępu interfejsu poza zestawem. Możliwe wartości to public
i private
. Wartość domyślna to private
. Zagnieżdżone interfejsy nie mogą mieć specyfikatora interface_access
.
name
Nazwa interfejsu.
inherit_access
Ułatwienia dostępu w pliku base_interface
. Jedynym dozwolonym dostępem dla interfejsu podstawowego jest public
(ustawienie domyślne).
base_interface
(Opcjonalnie) Podstawowy interfejs dla interfejsu name
.
Uwagi
interface struct
jest równoważne z interface class
.
Interfejs może zawierać deklaracje funkcji, zdarzeń i właściwości. Wszystkie elementy członkowskie interfejsu mają publiczne ułatwienia dostępu. Interfejs może również zawierać statyczne elementy członkowskie danych, funkcje, zdarzenia i właściwości, a te statyczne elementy członkowskie muszą być zdefiniowane w interfejsie.
Interfejs definiuje sposób implementacji klasy. Interfejs nie jest klasą, a klasy mogą implementować tylko interfejsy. Gdy klasa definiuje funkcję zadeklarowaną w interfejsie, funkcja jest implementowana, a nie zastępowana. W związku z tym wyszukiwanie nazw nie zawiera elementów członkowskich interfejsu.
Element class
lub struct
pochodzący z interfejsu musi implementować wszystkie elementy członkowskie interfejsu. Podczas implementowania interfejsu name
należy również zaimplementować interfejsy na base_interface
liście.
Aby uzyskać więcej informacji, zobacz:
Aby uzyskać informacje na temat innych typów CLR, zobacz Klasy i struktury.
W czasie kompilacji można wykryć, czy typ jest interfejsem za pomocą __is_interface_class(type)
polecenia . Aby uzyskać więcej informacji, zobacz Obsługa kompilatora dla cech typów.
W środowisku deweloperów możesz uzyskać pomoc F1 dotyczącą tych słów kluczowych, wyróżniając słowo kluczowe (na przykład interface class
) i naciskając F1.
Środowisko wykonawcze systemu Windows
Uwagi
(Nie ma żadnych uwag dotyczących tej funkcji językowej, które mają zastosowanie tylko do środowisko wykonawcze systemu Windows).
Wymagania
Opcja kompilatora: /ZW
środowiska uruchomieniowe w trakcie wykonania
Uwagi
(Nie ma żadnych uwag dotyczących tej funkcji języka, które mają zastosowanie tylko do środowiska uruchomieniowego języka wspólnego).
Wymagania
Opcja kompilatora: /clr
Przykłady
W poniższym przykładzie kodu pokazano, jak interfejs może definiować zachowanie funkcji zegara.
// 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
Poniższy przykład kodu przedstawia dwa sposoby implementowania funkcji z tym samym podpisem zadeklarowanym w wielu interfejsach i gdzie te interfejsy są używane przez klasę.
// 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 {}
};
Zobacz też
Rozszerzenia składników dla platformy .NET i platformy uniwersalnej systemu Windows