2

すべてのビュー モデルの抽象基本クラスを作成したかったのですが、アクセシビリティの問題が発生しており、エラーをナビゲートできないようです。これが私のコードの例です:

public ref class ViewModelBase {
    ...
}

public ref class OtherViewModel : ViewModelBase {
    ...
}

コードを上記の状態として定義すると、次のエラーが発生します。

エラー C4585: 'MyNamespace::ViewModelBase': WinRT の 'public ref class' は、封印されているか、封印されていない既存のクラスから派生している必要があります

代わりに、ViewModelBase を非公開にすると、次のエラーが発生します。

エラー C3213: 基本クラス 'MyNamespace::ViewModelBase' は 'OtherViewModel' よりアクセスしにくいです

これは信じられないほど単純なはずです。私は何を間違っていますか?

4

2 に答える 2

5

VS 2012 C++/CX では、汎用シナリオのパブリック クラスの継承がサポートされていないため、C++/CX では厳密には可能ではありません。XAML シナリオが機能するのに十分なだけサポートされています。可能な唯一の公開された封印されていない型は、Windows::UI::Xaml名前空間の下にあるものであり、ユーザーは独自の公開されていない封印されていない型を作成することはできません。

Windows::UI::Xamlすべてのビュー モデルの基本クラスが必要な場合は、すべてのクラスを非公開にするか、 ( などの)基本クラスから継承するための唯一のオプションDependencyObjectです。

これらのアプローチにはそれぞれ欠点があります。

  • DependencyObject をベースとして使用すると、すべてのビューモデルが STA オブジェクトになり (UI スレッドからのみ操作できるようになります)、実際には必要のない多くのオーバーヘッドが発生します。
  • クラスをプライベートにするということは、[Bindable]属性を使用してデータバインディングを行うことができないことを意味するため、プライベートデータバインディングの実装が必要になります。(プライベート クラスはICustomPropertyProvider、関連するインターフェイスを実装する必要があります。)
于 2012-11-05T21:32:57.530 に答える
-1

「sealed」キーワードは、クラスを継承できないことを意味します。実装は次のようになります。

ref class ViewModelBase sealed

ViewModelBase から継承する場合は、サブクラスのみを次のrefようなクラスにする必要があります。

class ViewModelBase

...

public ref class OtherViewModel sealed : ViewModelBase
于 2012-11-05T11:53:35.287 に答える