我正在使用的场景如下所示:
public interface INativeWindow { ... }
是一种本机窗口类型的界面,它包含一些必需的基本方法来实现,以便获得最小的窗口支持(例如最小化、恢复等)。这是属于接口项目的 C# 接口。
现在我想在CLINativeWindow
c++-cli 类中实现它:
public ref class CLINativeWindow: public SWF::NativeWindow, INativeWindow
{
...
}
最后,我有另一个ref
c++ cli 类,它有一个类型的内部成员CLINativeWindow
和一个返回INativeWindow^
句柄的包装属性:
virtual property INativeWindow^ OwnNativeWindow
{
INativeWindow^ __clrcall get() sealed { return NativeWindow;}
void __clrcall set(INativeWindow^ value) { NativeWindow = dynamic_cast<CLINativeWindow^>(value);}
}
这里的问题是它dynamic_cast
不起作用,属性的 getter 方法的隐式多态向下转换也不起作用。如果我没有被误导,我想我在几个地方读到了 C++ 中的普通指针,这样的错误确实有效。现在作为一个SWF::NativeWindow
经典的 windows 窗体原生窗口类(对不起,无意的头韵),它应该有一个虚拟方法,就像接口一样,所以动态转换运算符没有问题,因为涉及到多态继承。我错了还是这在 dotNet C++ CLI 中完全不可能?
编辑 附加代码:
public ref class ExampleForSO
{
CLINativeWindow^ NativeWindow;
virtual property INativeWindow^ OwnNativeWindow
{
INativeWindow^ __clrcall get() sealed { return NativeWindow;}
void __clrcall set(INativeWindow^ value) { NativeWindow = dynamic_c
ast<CLINativeWindow^>(value);}
}
}
错误来自编译时,它们声明不能对 getter 和 setter 执行转换/强制转换(即不能从 B^ 转换为 A^ 和从 B^ 转换为 A^)..
更新
如果类在不同的文件中,在标头中实现该属性是行不通的。在单独的.cpp
源文件中实现它不会再导致编译时错误,并且可以按需要工作。