从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)'提供一个实现


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

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

接口需要被定义为虚拟。 还要注意类减速后的“公共IMy ..”,它与C#语法略有不同。

如果可以的话,密封接口成员以提高性能,编译器将能够比典型的虚拟成员更紧密地绑定这些方法。

希望有帮助;)

我没有编译它,但看起来不错...哦,而且,将__clrcall定义为__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^ )
{
  //...
}
链接地址: http://www.djcxy.com/p/59607.html

上一篇: Implementing an interface declared in C# from C++/CLI

下一篇: Sandcastle: Any way to show inherited members without showing base class?