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_;
};