我正在使用的场景如下:
public interface INativeWindow { ... }
是本机窗口类型的接口,其具有一些必需的基本方法来实现以便具有最小窗口支持(例如,最小化,恢复等)。这是一个属于interfaces项目的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
源文件中实现它不会再导致编译时错误,并且可以按预期工作。
答案 0 :(得分:1)
这里没有多重继承。您的CLINativeWindow
继承自一个类:SWF::NativeWindow
,并且还在实现INativeWindow
接口。
您没有提供足够的信息(您获得了哪些错误?可以在VS中粘贴以重现问题的示例代码?),但一般来说,您发布的代码没有任何问题。
我的猜测是你的NativeWindow
被声明为:
CLINativeWindow NativeWindow;
没有急需的^
。尝试将其声明为:
CLINativeWindow^ NativeWindow;
修改强>
以下为我编译:
public interface class INativeWindow
{};
public ref class SWFNativeWindow
{};
public ref class CLINativeWindow : SWFNativeWindow, INativeWindow
{};
public ref class NWHolder
{
public:
virtual property INativeWindow^ OwnNativeWindow
{
INativeWindow^ __clrcall get() sealed { return nativeWindow_; }
void __clrcall set(INativeWindow^ w) { nativeWindow_ = dynamic_cast<CLINativeWindow^>(w); }
}
private:
CLINativeWindow^ nativeWindow_;
};