interface class (C++/CLI および C++/CX)interface class (C++/CLI and C++/CX)

インターフェイスを宣言します。Declares an interface. ネイティブ インターフェイスについては、__interface を参照してください。For information on native interfaces, see __interface.

すべてのランタイムAll Runtimes

構文Syntax

interface_access
interface class
name :  inherit_accessbase_interface{};interface_accessinterface structname :  inherit_accessbase_interface{};

パラメーターParameters

interface_accessinterface_access
アセンブリの外部のインターフェイスのアクセシビリティ。The accessibility of an interface outside the assembly. 指定できる値は publicprivate です。Possible values are public and private. 既定値は private です。private is the default. 入れ子になったインターフェイスでは、interface_access 指定子は指定できません。Nested interfaces cannot have an interface_access specifier.

namename
インターフェイスの名前。The name of the interface.

inherit_accessinherit_access
base_interface のアクセシビリティ。The accessibility of base_interface. 基底インターフェイスで許可されるアクセシビリティは public (既定値) だけです。The only permitted accessibility for a base interface is public (the default).

base_interfacebase_interface
(省略可能) インターフェイス name の基底インターフェイス。(Optional) A base interface for interface name.

解説Remarks

interface structinterface class と同等です。interface struct is equivalent to interface class.

インターフェイスには、関数、イベント、およびプロパティの宣言を含めることができます。An interface can contain declarations for functions, events, and properties. すべてのインターフェイス メンバーには、パブリック アクセシビリティがあります。All interface members have public accessibility. インターフェイスには静的データ メンバー、関数、イベント、およびプロパティを含めることもでき、これらの静的メンバーはインターフェイスに定義する必要があります。An interface can also contain static data members, functions, events, and properties, and these static members must be defined in the interface.

インターフェイスは、クラスを実装できる方法を定義します。An interface defines how a class may be implemented. インターフェイスはクラスではなく、クラスだけがインターフェイスを実装できます。An interface is not a class and classes can only implement interfaces. インターフェイスに宣言される関数をクラスで定義すると、オーバーライドなしで関数が実装されます。When a class defines a function declared in an interface, the function is implemented, not overridden. そのため、名前の参照には、インターフェイス メンバーは含まれません。Therefore, name lookup does not include interface members.

インターフェイスから派生するクラスまたは構造体は、インターフェイスのすべてのメンバーを実装する必要があります。A class or struct that derives from an interface must implement all members of the interface. インターフェイス name の実装時に、base_interface の一覧のインターフェイスも実装する必要があります。When implementing interface name you must also implement the interfaces in the base_interface list.

詳細については次を参照してください:For more information, see:

他の CLR 型については、クラスと構造体に関する記事を参照してください。For information on other CLR types, see Classes and Structs.

コンパイル時に、型が __is_interface_class(type) のインターフェイスかどうかを検出できます。You can detect at compile time if a type is an interface with __is_interface_class(type). 詳細については、「型の特徴のコンパイラ サポート」を参照してください。For more information, see Compiler Support for Type Traits.

開発環境では、キーワード (例: interface class) を強調表示し、F1 を押すことで、これらのキーワードの F1 ヘルプを取得できます。In the development environment, you can get F1 help on these keywords by highlighting the keyword, (interface class, for example) and pressing F1.

Windows ランタイムWindows Runtime

解説Remarks

(この言語機能には Windows ランタイムのみに適用される特記事項がありません。)(There are no remarks for this language feature that apply to only the Windows Runtime.)

要件Requirements

コンパイラ オプション: /ZWCompiler option: /ZW

共通言語ランタイムCommon Language Runtime

解説Remarks

(この言語機能には共通言語ランタイムのみに適用される特記事項がありません。)(There are no remarks for this language feature that apply to only the common language runtime.)

要件Requirements

コンパイラ オプション: /clrCompiler option: /clr

使用例Examples

次のコード例では、インターフェイスで clock 関数の動作を定義する方法を示します。The following code example demonstrates how an interface can define the behavior of a clock function.

// 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

次のコード例では、同じシグネチャが宣言された複数のインターフェイスと、これらのインターフェイスがクラスによって使用される場所を指定して関数を実装する 2 つの方法を示します。The following code sample shows two ways to implement functions with the same signature declared in multiple interfaces and where those interfaces are used by a class.

// 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 {}
};

関連項目See also

.NET および UWP でのコンポーネント拡張Component Extensions for .NET and UWP