C# 在接口中声明方法

C# 在接口中声明方法,c#,design-patterns,C#,Design Patterns,我有一个INetworkAware接口,需要声明方法,该方法将阻止每个类注册事件 目前使用prisms eventaggregator,我们的实现如下 protected override void SetupEvents() { RegisterForEvent<PatientSelected>(OnPatientSelected); base.SetupEvents(); } protected override void

我有一个INetworkAware接口,需要声明方法,该方法将阻止每个类注册事件

目前使用prisms eventaggregator,我们的实现如下

    protected override void SetupEvents()
    {
        RegisterForEvent<PatientSelected>(OnPatientSelected);
        base.SetupEvents();
    }
protected override void SetupEvents()
{
RegisterForEvent(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)
     {

     }
 }
public类PatientInformationViewModel:ViewModelBase,INetworkAware
{
受保护的覆盖无效设置事件()
{
RegisterForEvent(OnPatientSelected);
base.SetupEvents();
}
INetworkAware.ListenForNetworkChange
{
RegisterForEvent(OnNetworkChange)
}
OnNetworkChange(网络更改事件网络状态)
{
}
}
NetworkChangeEvent是一个示例POCO类

INetworkAware.ListenForNetworkChange和OnNetworkChange(NetworkChangeEvent networkstatus)必须在源自INetworkAware并具有相同签名的每个viewmodel中实现


我们怎样才能完成这个场景呢?

你几乎走上了正确的轨道。如果在基类上实现接口,然后在基类中将方法声明为
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()
(或类似)即可。

我已经这样做了,但并非所有派生类都侦听网络更改。这就是我声明接口的原因,尽管如此,所有ViewModels都源自ViewModelbase(它有RegisterForEvent方法,我需要将网络事件注册与其他事件分开,这是实现的一个困难部分。)me@Rati_Ge然后只需在ViewModelBase中使用空的
virtual
实现,并在必要时简单地覆盖它。空实现意味着您可以安全地调用该方法,但不需要事情完成了。不侦听事件的派生类根本不需要做任何事情,基类中的空实现覆盖了它。因此,你建议不要为此使用单独的接口?我认为这会更干净,因为我可以将所有实例转换为接口,并仅为那些不侦听事件的实例调用该方法INetworkAware@Rati_Ge您可以使用您需要的任何接口,例如,当我这样做时,我的接口被称为
ISubscribeEvents
。无论接口名称如何,您都可以将从ViewModelBase派生的所有视图模型强制转换为该接口类型,并调用方法
((INetworkAware)myPatientInformationViewModel)。SetupEvents()
。如果任何特定视图模型不需要执行任何操作,则不要覆盖
SetupEvents()
方法,这意味着将调用基本视图模型中的方法(而基本模型不执行任何操作)。