0

私が取り組んでいるシナリオは次のようになります。

public interface INativeWindow { ... }

最小限のウィンドウ サポート (最小化、復元など) を実現するために実装する必要があるいくつかの基本的なメソッドを保持するネイティブ ウィンドウ タイプのインターフェイスです。これは、interfaces プロジェクトに属する C# インターフェイスです。

CLINativeWindowこれをc++-cli クラスに実装したいと思います。

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

最後にref、型の内部メンバーとハンドルCLINativeWindowを返すラッピング プロパティを持つ別の c++ cli クラスがあります。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);}
            }
}

エラーはコンパイル時からのものであり、ゲッターとセッターの両方に対して変換/キャストを実行できないことを示しています (つまり、B^ から A^ および B^ から A^ に変換できません)。 UPDATE クラスが異なるファイルにある場合、ヘッダーにプロパティを実装することはできません。別のソース ファイルに実装すると.cpp、コンパイル時エラーが発生しなくなり、目的どおりに動作します。

4

1 に答える 1

1

ここには多重継承はありません。あなたCLINativeWindowは1つのクラスから継承しています: 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 に答える