0

2 つのインターフェイスがあります (1 つはサブスクライバー用、もう 1 つはパブリッシャー用)。

最初の 1 つは、イベントの発生を許可されているクライアントに表示される必要があります

   public interface IClientLogicEvents
   {
      IRaiseEvent<CallStateChangedEventArgs> CallStateChanged { get; }
   }

2 つ目は、これらのイベントをサブスクライブして処理するクライアントに表示される必要があります。

   public interface IHandleOnlyClientLogicEvents : IClientLogicEvents
   {
      ISubscribeEvent<CallStateChangedEventArgs> CallStateChanged { get; }
   }

イベントインターフェイスは次のようになります

   public interface ISubscribeEvent<out TEventArgs> where TEventArgs : EventArgs
   {
      void Subscribe(Action<object, TEventArgs> handler);
      void Unsubscribe(Action<object, TEventArgs> handler);
   }

    public interface IRaiseEvent<TEventArgs> : ISubscribeEvent<TEventArgs> where TEventArgs : EventArgs
   {
      void Raise(object sender, TEventArgs args);
   }

これらのインターフェイス (IClientLogicEvents と IHandleOnlyClientLogicEvents) の両方を実装するクラスが必要です。

このような:

public sealed class ClientLogicEvents : IClientLogicEvents, IHandleOnlyClientLogicEvents

また:

 public sealed class ClientLogicEvents : IHandleOnlyClientLogicEvents

問題はもちろん、プロパティを 2 回 (インターフェイスごとに) 実装する必要があることです。これには、プロパティを格納するための追加のフィールドが必要です。

    public sealed class ClientLogicEvents : IClientLogicEvents, IHandleOnlyClientLogicEvents, IDisposable
   {
      /// <summary>
      /// The internal call state changed event.
      /// </summary>
      private readonly CustomEvent<CallStateChangedEventArgs> _callStateChangedEvent;

      public ClientLogicEvents()
      {
         _callStateChangedEvent = new CustomEvent<CallStateChangedEventArgs>();
      }

      /// <summary>
      /// Gets the invokeable call state changed event.
      /// </summary>
      IRaiseEvent<CallStateChangedEventArgs> IClientLogicEvents.CallStateChanged { get { return _callStateChangedEvent; } }

      /// <summary>
      /// Gets the subscribe only call state changed event.
      /// </summary>
      ISubscribeEvent<CallStateChangedEventArgs> IHandleOnlyClientLogicEvents.CallStateChanged { get { return _callStateChangedEvent; } }
   }

しかし、プロパティの実装のためにこの量のコードを節約したいと思います (200 のイベントがあるため)。これはどういうわけか可能ですか?私はちょうど何かのようなものを持っていること

    public sealed class ClientLogicEvents : IClientLogicEvents, IHandleOnlyClientLogicEvents, IDisposable
   {
      /// <summary>
      /// Gets the invokeable call state changed event.
      /// </summary>
      public IRaiseEvent<CallStateChangedEventArgs> CallStateChanged { get; private set; }
   }

?

4

1 に答える 1

1

単一のプロパティが同時に2 つの型 (IRaiseEvent<CallStateChangedEventArgs>および) を持つことはできないため、両方のインターフェイスからの制約を満たす単一のプロパティを持つことはできません。ISubscribeEvent<CallStateChangedEventArgs>

IHandleOnlyClientLogicEvents質問の下部にある例は、インターフェイスを実装していません。

于 2013-10-21T14:31:51.917 に答える