2010-07-11 46 views
5

tôi có loại mã:Làm thế nào để gọi một sự kiện tự động khi một hàm được gọi?

public class Foo 
{ 
    public SomeHandler OnBar; 

    public virtual void Bar() 
    { 
    } 
} 

Foo là một lớp cơ sở và do các lớp khác có thể kế thừa từ nó.
Tôi muốn sự kiện OnBar luôn được kích hoạt khi Bar() được gọi ngay cả khi không được gọi rõ ràng bên trong Thanh.
Làm thế nào nó có thể được thực hiện?

Trả lời

9

Một mẫu chung là có phương pháp không ảo sẽ thực hiện những gì bạn muốn gọi là phương thức ảo. Các lớp con có thể ghi đè phương thức bên trong để thay đổi chức năng, nhưng phương thức công khai có thể không ảo trên luôn nâng cao sự kiện trước.

public class Foo 
{ 
    public SomeHandler OnBar; 

    public void Bar() 
    { 
     if (OnBar != null) 
     { 
      OnBar(this, EventArgs.Empty); 
     } 
     BarImpl(); 
    } 

    protected virtual void BarImpl() 
    { 
    } 
} 
+0

Về cơ bản, việc triển khai mẫu phương thức mẫu + 1 – DanP

+0

Vì vậy, đây là cách tốt nhất? Trong C++, tôi sẽ sử dụng bind() để tạo ra một hàm mới ngoài hàm gọi sự kiện và hàm ban đầu. –

2

Câu trả lời ngắn gọn: bạn không thể. Không phải với những gì Microsoft cung cấp cho bạn ra khỏi hộp.

Điều đó nói rằng, hãy xem "lập trình hướng khía cạnh" trong .NET. Google rằng, bạn có thể nhận được một cái gì đó hữu ích.

Nhập: Cách tiêu chuẩn sẽ là tăng sự kiện theo phương thức Bar() và sau đó yêu cầu tất cả các lớp dẫn xuất để gọi triển khai cơ sở. Nhưng bạn không thể thực thi nó.

1

trước hết mã bạn đã cung cấp sẽ không biên dịch.
các chức năng ảo phải có nội dung.

Để đảm bảo sự kiện được kích hoạt, bạn có thể làm một việc như thế này.

public class Foo 
{ 
    public SomeHandler OnBar; 

    public void Bar() 
    { 
    OnBar(); (check for nulls) 
    ProtectedBar(); 
    } 

    protected virtual ProtectedBar() 
    { 
    } 
} 
+0

Bạn chính xác. Tuy nhiên điều đó không quan trọng trong trường hợp này. Nó chỉ là để chứng minh rằng các chức năng có thể được overriden. Tôi không biết tại sao bạn lại bị downvoted. Tôi upvoted để cân bằng. –

+1

Mã bạn đã cung cấp sẽ không biên dịch - hàm ảo của bạn không có loại trả về và nhận xét của bạn không phải là nhận xét. –

+0

Tôi đoán một số nhà sưu tập huy hiệu đã bỏ phiếu cho tôi để nhận được huy hiệu. :) –

0

Như đã nói, tôi đoán cách tốt hơn để làm loại công cụ này là sử dụng Lập trình hướng Aspect.

Điều này sẽ giúp bạn với "mã vướng víu" (tức là gọi một sự kiện trong một phương thức không có trách nhiệm này) và "mã phân tán" (tức là gọi cùng một sự kiện theo nhiều phương pháp, sao chép mã của bạn) vấn đề.

Bạn nên xem postsharp, phiên bản này có phiên bản cộng đồng miễn phí.

Các vấn đề liên quan