次のように定義された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)'
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^ )
{
//...
}