0

我正在使用的场景如下所示:

public interface INativeWindow { ... }

是一种本机窗口类型的界面,它包含一些必需的基本方法来实现,以便获得最小的窗口支持(例如最小化、恢复等)。这是属于接口项目的 C# 接口。

现在我想在CLINativeWindowc++-cli 类中实现它:

public ref class CLINativeWindow: public SWF::NativeWindow, INativeWindow
{ 
 ...
}

最后,我有另一个refc++ 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源文件中实现它不会再导致编译时错误,并且可以按需要工作。

4

1 回答 1

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_;
};
于 2012-07-06T11:27:36.617 回答