Реализация интерфейса, объявленного в C # из C ++ / CLI - PullRequest
32 голосов
/ 19 мая 2009

Скажем, у меня есть интерфейс C # с именем IMyInterface, определенный следующим образом:

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

Предположим, у меня также есть класс C ++ / CLI, MyConcreteClass, который реализует этот интерфейс и заголовок которого объявлен следующим образом:

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

};

Как реализовать метод Foo и свойство MyProperty в заголовке C ++ / CLI?

Моя попытка приводит к следующей ошибке компиляции:

ошибка C3766: «MyConcreteClass» должен обеспечить реализацию для метод интерфейса 'void IMyInterface :: Foo (System :: String ^ значение) '

1 Ответ

36 голосов
/ 19 мая 2009
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^ )
{
  //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...