Реализация интерфейса, объявленного в C# из C++/CLI
Скажем, у меня есть интерфейс 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^ value)"
1 ответ
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^ )
{
//...
}