8

イベントを公開する「プロセッサ」インターフェイス(OnProcess)があるとします。通常、実装者が処理を行います。したがって、私はこのイベントを安全にサブスクライブでき、確実に発生します。しかし、1つのプロセッサは処理を行いません。したがって、サブスクライバーがそのプロセッサをサブスクライブするのを防ぎたいと思います。それをしてもいいですか?言い換えると、以下のコードでは、最後の行で例外をスローする必要があります。

var emptyProcessor = new EmptyProcessor();
emptyProcessor.OnProcess += event_handler; // This line should throw an exception.
4

2 に答える 2

8
class EmptyProcessor : IProcessor {

    [Obsolete("EmptyProcessor.OnProcess should not be directly accessed", true)]
    public event EventHandler OnProcess { 
        add { throw new NotImplementedException(" :( "); }
        remove { }
    }
}

この状況では、trueObsoleteのパラメーターにより、コンパイル時の例外が発生します。それで:

EmptyProcessor processor1 = new EmptyProcessor();
IProcessor processor2 = new EmptyProcessor();

processor1.OnProcess += handler;  // <-- compile-time error
processor2.OnProcess += handler;  // <-- run-time error
于 2010-02-17T17:44:38.863 に答える
0

addカスタム/メソッドで実装できますremoveが、これは悪い習慣だと思います。

ほら、あなたはインターフェース、異なるクラスによって実装されるコントラクトを持っています。
OnProcessはこの契約の一部であり、決して特別なものではありません。

通常、同じ操作セットで異なるクラスを操作する場合は、インターフェイスを使用します。インターフェイスを使用すると、次のようにコーディングできます。

IProcessor proc = GetProcessorAnyhow ();
proc.DoSomething ();

コンパイルタイプで具体的なタイプを知らなくても。

しかし、あなたのアプローチでは、

IProcessor proc = GetProcessorAnyhow ();
proc.OnProcess += (sender, e) => { };

絶対に正当なコードのように見えますが、明白な理由なしに失敗する可能性があります。間違ったコードが間違っているように見える
ことを常に確認してください。

次の設計ミスのいずれかを行った可能性があります。

  • それは各プロセッサの契約ではないかもしれませんがOnProcessIProcessor入れてください;
  • 実装EmptyProcessorしましたIProcessorが、実際には契約を満たすことができません
于 2011-03-04T21:23:28.067 に答える