在接口中声明方法

时间:2012-10-02 10:53:16

标签: c# design-patterns

我有一个接口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派生并具有相同签名的每个视图模型中实现。

我们可以完成这个场景

1 个答案:

答案 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()(或类似的)。