gpt4 book ai didi

c++-cli - 从 C++/CLI 实现在 C# 中声明的接口(interface)

转载 作者:行者123 更新时间:2023-12-03 08:30:01 24 4
gpt4 key购买 nike

假设我有一个名为 IMyInterface 的 C# 接口(interface)定义如下:

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

假设我还有一个 C++/CLI 类 MyConcreteClass ,它实现了这个接口(interface),并且它的头声明如下:
// C++/CLI header file
ref class MyConcreteClass : IMyInterface
{
public:

};

如何实现 Foo 方法和属性(property) MyProperty在 C++/CLI 头文件中?

我的尝试导致以下编译错误:

error C3766: 'MyConcreteClass' must provide an implementation for the interface method '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; } }
};

接口(interface)需要定义为虚拟的。还要注意类声明后的“public IMy..”,它的语法与 C# 略有不同。

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

希望有帮助;)

我没有编译它,但对我来说看起来不错......哦,另外,将您的方法定义为 __clrcall 消除了双重 thunk 性能损失的危险。

编辑
属性的正确语法是:
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^ )
{
//...
}

关于c++-cli - 从 C++/CLI 实现在 C# 中声明的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/880984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com