web-dev-qa-db-ja.com

C ++ / CLIからC#で宣言されたインターフェイスを実装する

次のように定義されたIMyInterfaceというC#インターフェイスがあるとします。

// C# code
public interface IMyInterface
{
  void Foo(string value);
  string MyProperty { get; }
}

このインターフェイスを実装し、ヘッダーが次のように宣言されているC++/CLIクラスMyConcreteClassもあるとします。

// C++/CLI header file
ref class MyConcreteClass : IMyInterface
{
public:

};

C++/CLIヘッダーにメソッドFooとプロパティMyPropertyをどのように実装しますか?

私の試みは次のコンパイルエラーになります:

エラーC3766:「MyConcreteClass」はインターフェースメソッドの実装を提供する必要があります 'void IMyInterface :: Foo(System :: String ^ value)'

35
Simon Brangwin
public ref class MyConcreteClass : public IMyInterface
{
 public:
  virtual void __clrcall Foo(String^ value) sealed;  

  virtual property String^ __clrcall MyProperty 
         { String^ get() sealed { String::Empty; } }
};

インターフェイスは仮想として定義する必要があります。また、クラスのデクレレーション後の「public IMy ..」は、C#とは少し異なる構文であることに注意してください。

可能であれば、インターフェイスメンバーをシールしてパフォーマンスを向上させると、コンパイラはこれらのメソッドを通常の仮想メンバーよりも緊密にバインドできるようになります。

それが役立つことを願っています;)

私はそれをコンパイルしませんでしたが、私には良さそうです...ああ、そしてまた、あなたのメソッドを__clrcallとして定義することは、二重のサンクパフォーマンスペナルティの危険を排除します。

編集プロパティの正しい構文は次のとおりです。

public ref class MyConcreteClass : public IMyInterface
{
 public:
  virtual property String^ MyProperty 
  {
    String^ get() sealed { return String::Empty; };
    void set( String^ s ) sealed { };
  }
};

または、定義をソースファイルに入れる場合:

public ref class MyConcreteClass : public IMyInterface
{
 public:
  virtual property String^ MyProperty 
  {
    String^ get() sealed;
    void set( String^ s ) sealed;
  }
};

String^ MyConcreteClass::MyProperty::get()
{
  return String::Empty;
}

void MyConcreteClass::MyProperty::set( String^ )
{
  //...
}
37