私が取り組んでいるシナリオは次のようになります。
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
、コンパイル時エラーが発生しなくなり、目的どおりに動作します。