2013-08-15 21 views
8
public class Basket 
{ 
    private int _unitCount; 

    public int UnitCount 
    { 
     get { return _unitCount; } 
     set 
     { 
      _unitCount = Math.Max(0, value); 
      OnUnitCountChanged(new EventArgs()); 
     } 
    } 

    public event EventHandler UnitCountChanged; 
    public event EventHandler Depleted; 

    protected virtual void OnUnitCountChanged(EventArgs args) 
    { 
     var handler = UnitCountChanged; 
     if(handler!=null) { handler(this, args); } 
     if(_unitCount == 0) { OnDepleted(new EventArgs()); } 
    } 

    protected virtual void OnDepleted(EventArgs args) 
    { 
     var handler = UnitCountChanged; 
     if(handler!=null) { handler(this, args); } 
    } 
} 

Có một vấn đề với việc kiểm tra các điều kiện để cạn kiệt và nâng cao sự kiện rằng nếu cần thiết trong kiện UnitCountChanged, hay tôi nên làm cả hai trong setter UnitCount (và bất cứ nơi nào khác trong một ví dụ không tầm thường)?Có mùi nào để tăng sự kiện từ một sự kiện khác không?

+1

Nếu đó là không tầm thường để xác định rằng một mục được cạn kiệt từ 'sự kiện OnUnitCountChanged', tôi sẽ cho rằng sự kiện 'OnDepleted' là dư thừa. – Matthew

+0

Về mặt kỹ thuật, nhưng tôi muốn giảm thiểu số lượng nơi tôi sẽ phải viết mã chính xác đó, ví dụ: xóa đối tượng đã cạn khỏi vùng chứa, hiển thị các hiệu ứng trong giao diện người dùng, v.v. ví dụ xuống sẽ nhắc nhận xét của bạn. –

Trả lời

9

Trong khi tôi đã nhìn thấy nó, tôi sẽ khuyên bạn nên chống lại nó và nâng cao sự kiện trong các phương pháp mà nó sẽ xảy ra trong, như thiết lập UnitCount của bạn. Vì bạn có từ khóa sửa đổi truy cập virtual, người nào đó có thể ghi đè phương thức và nếu họ không gọi đối tượng cơ sở thì từ khóa đó sẽ không hoạt động như mong đợi.

Tôi không phải là người làm cho việc sử dụng mã của tôi phức tạp hơn.

6

Có những lúc nó có thể hữu ích (ví dụ, nếu bạn đang mở rộng một lớp cơ sở và không có khả năng ghi đè lên các phương thức đang nâng cao sự kiện), nhưng nói chung, tôi khuyên bạn nên chống lại nó .

Trong trường hợp này, tôi muốn nói rằng nó tốt hơn để nâng cao cả hai sự kiện trong UnitCount setter:

public int UnitCount 
{ 
    get { return _unitCount; } 
    set 
    { 
     _unitCount = value; 
     OnUnitCountChanged(new EventArgs()); 
     if(_unitCount == 0) { OnDepleted(new EventArgs()); } 
    } 
} 
Các vấn đề liên quan