【发布时间】:2012-07-06 08:33:13
【问题描述】:
我正在使用的场景如下所示:
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++ 中使用 normal 指针的几个地方读到过,这样的错误确实有效。现在,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 源文件中实现它不会再导致编译时错误,并且可以正常工作。
【问题讨论】:
标签: c# winforms dynamic c++-cli multiple-inheritance