2011-01-26 30 views
10

Gần đây tôi đã hoàn thành thực tập 6 tháng tại một công ty sử dụng C# cho phần lớn chương trình của họ. Trong thời gian này, lần đầu tiên tôi sử dụng và đã quen với cách thực hiện C#. Như được hiển thị bên dưới:C# giống như các sự kiện trong ngôn ngữ lập trình D

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

D có hỗ trợ cấu trúc như vậy không? Tôi tưởng tượng một người có thể được tạo ra bởi người dùng bằng cách sử dụng toán tử quá tải, nhưng tôi không hoàn toàn chắc chắn. Nếu nó không thể là những gì sau đó sẽ là một cách phổ biến ngoại trừ làm việc đó sau đó?

Trả lời

11

Cấu trúc tương đương trong D là sử dụng Signals and Slots. Đây là một phương tiện khác nhau để triển khai thực hiện Observer Pattern, đó chính là điều mà sự kiện C# thực hiện.

1

Nếu bạn đang cảm thấy sự cần thiết phải sử dụng C# style-sự kiện thay vì tín hiệu và khe, họ cực kỳ đơn giản để thực hiện:

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

Kiểm tra hệ thống sự kiện DFL của. Nó hoạt động chính xác giống như C# .NET.

DFL Event Example

Tải DFL, lấy module sự kiện và sử dụng nó theo cách bạn muốn. Tôi đã sửa đổi nó để sử dụng các đối số mẫu của Denisdic. Điều này mang lại sự linh hoạt tối đa.

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

1

Dưới đây là một ví dụ về C# phong cách sự kiện sử dụng tín hiệu, khe, và một mẫu:

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); 
    } 
} 

khai:

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

instantiation:

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

sự kiện cháy:

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

đăng ký quan sát viên:

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

    void handleEventOfInt(int g) 
    { /*do something */ } 
    void handleEventOfStringAndInt(string str, int g) 
    { /*do something */ } 
Các vấn đề liên quan