2012-11-05 38 views
2

我想为我的所有视图模型创建一个抽象基类,但是我遇到了可访问性问题,似乎无法浏览这些错误。下面是我的代码示例:如何使用WinRT类创建公共视图模型库?

public ref class ViewModelBase { 
    ... 
} 

public ref class OtherViewModel : ViewModelBase { 
    ... 
} 

当我确定我的代码为国家上面,我得到以下错误:

错误C4585:“了myNameSpace :: ViewModelBase”:一个WinRT的“公共引用类“必须被密封或从现有的未密封类

如果不是得到,我做ViewModelBase私人,我得到这个错误:

错误C3213:基类的MyNamespa ce :: ViewModelBase'不如'OtherViewModel'可访问

这似乎应该是非常简单。我究竟做错了什么?

回答

5

什么你试图不严格可能在C++/CX中使用,如在VS 2012中C++/CX不支持通用场景的公共类继承。它只支持XAML方案的工作;唯一可能的公开非密封类型是在Windows::UI::Xaml名称空间下找到的类型,用户无法编写自己的公开非密封类型。

如果您想要为所有视图模型创建基类,那么您只能选择使所有类都是私有的或从基类(如DependencyObject)继承。

每一种方法都有缺点:使用的DependencyObject作为基地

  • 让所有的ViewModels STA对象除了(所以他们只能从UI线程操作)具有大量的开销是ISN没有必要。
  • 将你的类私有化意味着你不能使用[Bindable]属性来执行数据绑定,所以你需要有一个私有的数据绑定实现。 (您的私有类需要实现ICustomPropertyProvider和相关的接口。)
+0

感谢您的澄清。我注意到一个BindableBase类带有一个新的项目模板,并且它使用了DependencyObject。虽然我觉得这个限制相当令人沮丧,但很好理解,以便继续。 –

+2

是的,这个限制在产品周期中显得有点晚,并且在Windows Runtime团队的要求下,他们希望为将来的版本保留该功能(通用运行时类继承),当我们有更多的跑道去设计更多连贯的故事。 所有的语言预测都有这个限制,但是它在C#中不那么痛苦,因为运行时反射允许它们支持私有类的数据绑定。 –

+0

这是我见过的最糟糕的设计,完全破坏了面向对象的范例。 –

-1

“sealed”关键字表示该类不能被继承。你的实现应该是这个样子:

ref class ViewModelBase sealed 

如果你想从ViewModelBase继承,那么你需要有唯一的子类ref类这样的:

class ViewModelBase 

... 

public ref class OtherViewModel sealed : ViewModelBase 
+1

对,我绝对不希望被密封的基石 - 它的全部目的就是要继承。第二个例子产生错误。 ref类只能从其他的ref类或接口派生。 –

+0

我可能错过了一些东西。我从这里拿我的例子:http://msdn.microsoft.com/en-us/library/windows/apps/hh699870.aspx – mydogisbox