C# C++;CLI动态转换和多重继承(Windows窗体和界面)
我正在处理的场景如下所示:C# C++;CLI动态转换和多重继承(Windows窗体和界面),c#,winforms,dynamic,c++-cli,multiple-inheritance,C#,Winforms,Dynamic,C++ Cli,Multiple Inheritance,我正在处理的场景如下所示: public interface INativeWindow { ... } 是一种本机窗口类型的接口,其中包含一些必需的基本方法,以实现最小的窗口支持(例如最小化、还原等)。这是属于接口项目的C#接口 现在,我想在CLINativeWindowc++-cli类中实现它: public ref class CLINativeWindow: public SWF::NativeWindow, INativeWindow { ... } 最后,我还有另一个 REF
public interface INativeWindow { ... }
是一种本机窗口类型的接口,其中包含一些必需的基本方法,以实现最小的窗口支持(例如最小化、还原等)。这是属于接口项目的C#接口
现在,我想在CLINativeWindow
c++-cli类中实现它:
public ref class CLINativeWindow: public SWF::NativeWindow, INativeWindow
{
...
}
最后,我还有另一个<代码> REF> /Cuffe+C++ CLI类,它具有<代码> CLINativeWindow < /C>类型的内部成员和一个返回< <代码>私有窗口> <代码>句柄的包装属性:
virtual property INativeWindow^ OwnNativeWindow
{
INativeWindow^ __clrcall get() sealed { return NativeWindow;}
void __clrcall set(INativeWindow^ value) { NativeWindow = dynamic_cast<CLINativeWindow^>(value);}
}
这些错误来自编译时,它们表示无法对getter和setter执行转换/强制转换(即无法从B^转换为A^和从B^转换为A^)。。
更新
如果类位于不同的文件中,则在头中实现该属性是不行的。在单独的
.cpp
源文件中实现它不会再导致编译时错误,并且可以根据需要工作。这里没有多重继承。您的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_;
};
公共接口类
{};
公共参考类SWFNativeWindow
{};
公共引用类CLINativeWindow:SWFNativeWindow,INativeWindow
{};
公共参考等级NWHolder
{
公众:
虚拟属性INativeWindow ^OwnNativeWindow
{
INativeWindow^_clrcall get()密封{返回本机窗口}
void uu clrcall set(INativeWindow^w){nativeWindow_u=dynamic_ucast(w);}
}
私人:
ClintiveWindow^本地窗口;
};
我确实在类型中包含了句柄说明符。我认为在C++-CLI中没有“实现接口”这样的概念,它只是类似于C++的“继承抽象类”习惯用法。这就是我在标题中指定多重继承的原因。此外,是否可以使用动态\u cast
运算符将实现类转换为其接口
句柄。。什么时候派生类还继承另一个类?这是主要的问题,从我在互联网上的发现,我没有任何线索。谢谢感谢您的更新,而不是swfnavivewindow
ref类,您是否可以尝试改为:System::Windows::Forms::NativeWindow
?它应该可以,因为WndProc
是一种虚拟受保护的方法。。但对我来说,情况并非如此。谢谢你的模拟代码。这正是我所说的示例性场景,只是为了一个微小的区别:我使用的是System::Windows::Forms::NativeClass
,而SWF
只是一个名称空间别名。在这种情况下,强制转换失败(但它应该像为您所做的那样工作)。此外,我认为要使强制转换与多态性一起工作,基类中至少需要一个虚拟方法。即使使用System::Windows::Forms::NativeWindow
,仍然可以为我编译。请尝试在此处编译示例代码,然后与实际代码进行比较。至于<代码> DyjixCase<代码>,你所说的C++是正确的。但是,对于C++/CLI中的托管类型,dynamic_cast
相当于C#作为
关键字。谢谢,我尝试了它,它也可以为我编译,没有任何问题,但是在一个空项目中,在主cpp文件中。我想问题出在别处。
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_;
};