2

我想为我的所有视图模型创建一个抽象基类,但我遇到了可访问性问题并且似乎无法浏览错误。这是我的代码示例:

public ref class ViewModelBase {
    ...
}

public ref class OtherViewModel : ViewModelBase {
    ...
}

当我将代码定义为上述状态时,出现以下错误:

错误 C4585:“MyNamespace::ViewModelBase”:WinRT“公共引用类”必须是密封的或派生自现有的未密封类

相反,如果我将 ViewModelBase 设为私有,则会收到此错误:

错误 C3213:基类“MyNamespace::ViewModelBase”比“OtherViewModel”更难访问

这看起来应该非常简单。我究竟做错了什么?

4

2 回答 2

5

您所尝试的在 C++/CX 中是不可能的,因为在 VS 2012 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 回答