2012-04-10 48 views
5

Tôi gặp khó khăn trong việc tìm ra cách lập trình các cuộc gọi phương thức ủy nhiệm qua các lớp trong C#. Tôi đến từ thế giới của Objective-C, điều này có thể gây nhầm lẫn cho tôi. Trong Objective-C, tôi có thể gán một đối tượng ủy nhiệm bên trong một lớp con, là lớp cha (I.e., childViewcontroller.delegate = self;). Sau đó, tôi có thể kích hoạt một phương thức trong lớp đại biểu bằng cách sử dụng:Gọi các phương thức Ủy quyền từ một lớp khác

if([delegate respondsToSelector:@selector(methodName:)]) { 
    [delegate methodName:parametersgohere]; 
} 

Tuy nhiên, tôi không thể tìm ra cách thực hiện điều này trong C#. Tôi đã đọc một chút về đại biểu C# nói chung (ví dụ, here), nhưng tôi vẫn còn bị mắc kẹt.

Có ví dụ nào giải thích điều này không?

Đây là kịch bản của tôi đầy đủ: Tôi có classA mà instantiates một thể hiện của classB. ClassB kích hoạt một phương thức (gọi một dịch vụ web), và khi trả lời, tôi muốn kích hoạt một phương thức trong classA.

Bất kỳ loại hướng dẫn 'Hello World' nào có thể giải thích những điều cơ bản về điều này?

+1

Hãy nhớ rằng đại biểu C# /. NET là một loại hoàn toàn khác biệt của các đại biểu mục tiêu C/Cocoa. – BoltClock

+0

@ BoltClock'saUnicorn: Vâng, tôi nghĩ rằng đó là nơi tôi đang đi sai. Nhưng tôi vẫn muốn tìm ra cách nhân rộng kịch bản trên. :-) – Brett

+0

Thuật ngữ "đại biểu" có thể có nghĩa là nhiều thứ. Trong C# nó có nghĩa là "một đối tượng đại diện cho một con trỏ hàm". Tôi không chắc nó có ý nghĩa gì đối với bạn. – Gabe

Trả lời

4

Trong C# những gì tôi nghĩ bạn đang tìm kiếm được gọi là sự kiện. Chúng là một tính năng ngôn ngữ cho phép một cá thể lớp để trưng ra một đại biểu công khai theo cách mà các cá thể lớp khác có thể đăng ký. Chỉ có lớp phơi bày được phép nâng cao sự kiện.

Trong ví dụ của bạn:

public class ClassB { 
    // Note the syntax at the end here- the "(s, e) => { }" 
    // assigns a no-op listener so that you don't have to 
    // check the event for null before raising it. 
    public event EventHandler<MyEventArgs> MyEvent = (s, e) => { } 

    public void DoMyWork() { 
     // Do whatever 

     // Then notify listeners that the event was fired 
     MyEvent(this, new MyEventArgs(myWorkResult)); 
    } 
} 

public class ClassA { 
    public ClassA(ClassB worker) { 
     // Attach to worker's event 
     worker.MyEvent += MyEventHandler; 

     // If you want to detach later, use 
     // worker.MyEvent -= MyEventHandler; 
    } 

    void MyEventHandler(Object sender, MyEventArgs e) { 
     // This will get fired when B's event is raised 
    } 
} 

public class MyEventArgs : EventArgs { 
    public String MyWorkResult { get; private set; } 
    public MyEventArgs(String myWorkResult) { MyWorkResult = myWorkResult; } 
} 

Lưu ý rằng ở trên sẽ được đồng bộ. Sự hiểu biết của tôi là các đại biểu mục tiêu-C là tất cả các mẫu của diễn viên, vì vậy chúng không đồng bộ. Để thực hiện các asynch trên, bạn sẽ cần phải delve vào luồng (có thể muốn google "C# Thread pool").

+1

Tôi nghĩ OP cần A và B ngược lại;) B là đứa trẻ, B "gọi" Một phương pháp (vì vậy B nâng cao sự kiện, A suscribe vào nó) – gbianchi

+0

Có thể - trong trường hợp đó tôi đang cho anh ta lợi ích của nghi ngờ rằng anh ta có thể tìm ra cách đảo ngược mô hình. –

+0

Tôi đã sửa nó theo cách :-) –

3

Một đại biểu là một đối tượng trỏ đến một phương pháp, có thể là phương pháp tĩnh hoặc ví dụ. Vì vậy, ví dụ, bạn sẽ chỉ cần sử dụng các mô hình sự kiện:

class Caller { 
    public void Call() { 
     new Callee().DoSomething(this.Callback); // Pass in a delegate of this instance 
    } 

    public void Callback() { 
     Console.WriteLine("Callback called!"); 
    } 
} 

class Callee { 
    public void DoSomething(Action callback) { 
     // Do stuff 
     callback(); // Call the callback 
    } 
} 

... 

new Caller().Call(); // Callback called! 

Các dụ Caller vượt qua một đại biểu cho phương thức DoSomething các Callee dụ, mà lần lượt gọi nhọn-phương pháp, đó là phương pháp Callback của Caller ví dụ.

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