接口类(C++ 组件扩展)
声明接口。 有关本机接口的信息,请参见 __interface。
所有运行时
语法
interface_access interface class name : inherit_access base_interface {};
interface_access interface struct name : inherit_access base_interface {};
参数
interface_access
一个接口的可访问性在程序集外。 可能的值为 公共 和 private。 默认为 private 类型。 嵌套接口不能有 interface_access 说明符。name
接口名。inherit_access
base_interface的可访问性。 基本接口的唯一允许的辅助功能。 public (默认值)。base_interface (可选)
接口的 名称基本接口。
备注
interface struct 与 interface class等效。
接口可以包含功能、事件和属性的说明。 所有接口成员具有公共可访问性。 接口也可以包含静态数据成员、函数、事件和属性,并且,这些静态成员在接口必须定义。
接口定义类如何实现。 接口不是类,而类只能实现接口。 当类定义接口中声明的函数,该函数实现,未被重写。 因此,名称查找不包括接口成员。
从接口派生的类或结构必须实现接口的所有成员。 当实现接口 名称时 还必须实现在 base_interface 的接口列表。
有关更多信息,请参见:
有关其他 CLR 类型的信息,请参见 类和结构。
,如果类型与 __is_interface_class(type),的接口可以检测在编译时。 有关更多信息,请参见 编译器支持类型特征(C++ 组件扩展)。
在开发环境中,您通过显示关键字,interface class(例如,) 并按 F1 可以在这些关键字获取 F1 帮助。
Windows 运行时
备注
(不适用于运行时仅的窗口。) 此语言功能的备注
要求
编译器选项: /ZW
公共语言运行时
备注
(不是仅适用于公共语言运行时)。此语言功能的备注
要求
编译器选项: /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();
}
Output
示例
下面的代码示例演示两种方法实现与多个接口声明的相同签名的功能,类的地方使用这些接口。
// 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 {}
};