我有一个接口INetworkAware,需要声明一个方法,它会阻止每个类注册事件
目前使用prisms eventaggregator我们的实现如下。
protected override void SetupEvents()
{
RegisterForEvent<PatientSelected>(OnPatientSelected);
base.SetupEvents();
}
SetupEvents方法在ViewModelbase类中声明为虚拟。在外面我们希望有上面提到的INetworkAware接口,除了从ViewModelBase派生,如果任何类有兴趣听取网络变化(网络离线/在线)和实现INetworkAware接口,我们希望有机制强制他们注册这个使用相同主体的事件。 例如,如果我们创建类
public class PatientInformationViewModel : ViewModelBase, INetworkAware
{
protected override void SetupEvents()
{
RegisterForEvent<PatientSelected>(OnPatientSelected);
base.SetupEvents();
}
INetworkAware.ListenForNetworkChange
{
RegisterForEvent<NetworkChangeEvent>(OnNetworkChange)
}
OnNetworkChange(NetworkChangeEvent networkstatus)
{
}
}
NetworkChangeEvent是一个示例POCO类
INetworkAware.ListenForNetworkChange和OnNetworkChange(NetworkChangeEvent networkstatus)必须在从INetworkaware派生并具有相同签名的每个视图模型中实现。
我们可以完成这个场景
答案 0 :(得分:2)
你几乎走在正确的轨道上。如果在基类上实现接口,然后在基类中将方法声明为abstract
,则会强制任何扩展(派生)类实现它自己的版本:
public abstract class ViewModelBase : INetworkAware
{
public abstract void SetupEvents();
}
public class PatientInformationViewModel : ViewModelBase
{
public override void SetupEvents()
{
//register for your events
}
}
或者,您可以将基类中的方法声明为virtual
而不是abstract
并提供基本实现,并且派生类可以在必要时简单地覆盖它。我之前使用过这种模式并且它非常有效 - 只要确保在界面上也包含Unsubscribe()
(或类似的)。