2011-01-26 16 views
10

私は最近、プログラミングの大部分をC#で扱う会社で6ヶ月のインターンシップを終えました。この時間の間、私はまずイベントを行うC#の方法に慣れてきました。以下に示すように:C#のようなイベントがDプログラミング言語にあります

acc.AccountBalanceLow += new AccountBalanceDelegate(atm.AccountToLow); 
acc.AccountBalanceLow +=new AccountBalanceDelegate(atm.AccountToLowAgain); 

Dはこのような構成をサポートしていますか?私は、演算子のオーバーロードを使用してユーザーが作成できるとは思いますが、私は完全にはわかりません。それができない場合は、それから何をするのが普通の例外的な方法でしょうか?

答えて

11

Dの同等の構成は、Signals and Slotsを使用します。これは、Observer Patternを実装する別の手段です。これは事実上C#イベントと同じです。

4

D(およびC++)は、signals and slotsという類似のパターンを使用します。

1

あなたの代わりにシグナルとスロットのC#スタイル・イベントを使用する必要性を感じているならば、彼らは実装が非常に簡単です:

module fluidity.core.event; 

class Event { 
    alias void delegate(EventArgs) handler_t; 

    handler_t[] handlers; 
    Object owner; 

    this() {} 
    this(Object o) { owner = o; } 

    void attach(handler_t handler) { 
     if (handler) 
      handlers ~= handler; 
    } 

    void detach(handler_t handler) { 
     int i = -1; 
     foreach (j, h; handlers) 
     { 
      if (h is handler) 
      { 
       i = j; 
       break; 
      } 
     } 

     if (i > -1) 
      handlers = handlers[0..i] ~ handlers[i+1..$]; 
    } 

    void raise() { raise(new EventArgs(owner)); } 
    void raise(EventArgs e) { 
     // call all handlers 
     foreach (handler; handlers) 
     { 
      if (handler) 
       handler(e); 
     } 
    } 

    void opAddAssign(handler_t handler) { 
     attach(handler); 
    } 

    void opSubAssign(handler_t handler) { 
     detach(handler); 
    } 

} 

class EventArgs { 
    Object source; 
    bool handled; 

    void handle() { handled = true; } 

    this() {} 
    this(Object s) { 
     source = s; 
    } 
} 
0

DFLのイベントシステムをチェックしてください。これは、C#.NETとまったく同じように動作します。

DFL Event Example

、DFLをダウンロードするイベントモジュールを取得し、それをあなたが好きな方法を使用しています。バリデーショナルのテンプレート引数を使うように修正しました。これにより最大の柔軟性が得られます。ここ

http://www.dprogramming.com/dfl098.zip

1

信号、スロット、およびテンプレートを使用してC#のスタイルイベントの例である:

events.d:

import std.signals; 

class Event(T...){ 
    mixin Signal!(T);  

    void broadcast(T args){ 
     emit(args); 
    }  
    void opAddAssign(slot_t slot){ 
     connect(slot); 
    } 
    void opSubAssign(slot_t slot) { 
     disconnect(slot); 
    } 
} 

が宣言:

public Event!(int) onSomeEventOfInt; 
    public Event!(string, int) onSomeEventOfStringAndInt; 

インスタンス化:

this.onSomeEventOfInt = new Event!(int)(); 
    this.onSomeEventOfStringAndInt = new Event!(string, int)(); 

火災イベント:

int i = 4; 
    string str = "hello"; 
    this.onSomeEventOfInt.broadcast(i); 
    this.onSomeEventOfStringAndInt.broadcast(str, 4); 

オブザーバー登録:

obj1.onSomeEventOfInt += &handleEventOfInt 
    obj1.onSomeEventOfStringAndInt += &handleEventOfStringAndInt 

    void handleEventOfInt(int g) 
    { /*do something */ } 
    void handleEventOfStringAndInt(string str, int g) 
    { /*do something */ } 
関連する問題