2008-08-28 41 views
88

Một số địa điểm trên thế giới thực có thể gọi cho đại biểu là gì? Tôi tò mò về những tình huống hoặc các mẫu hiện diện khi phương pháp này là giải pháp tốt nhất. Không cần mã.Tôi sử dụng đại biểu ở đâu?

Trả lời

29

Đại biểu là loại được đặt tên xác định loại phương pháp cụ thể. Cũng như định nghĩa lớp đưa ra tất cả các thành viên cho loại đối tượng đã cho nó xác định, đại biểu đưa ra chữ ký phương thức cho loại phương thức mà nó định nghĩa.

Dựa trên tuyên bố này, đại biểu là con trỏ hàm và xác định hàm đó trông như thế nào.

Ví dụ tuyệt vời cho ứng dụng thực tế của đại biểu là Predicate. Trong ví dụ từ liên kết, bạn sẽ thấy rằng Array.Find lấy mảng để tìm kiếm và sau đó là một vị từ để xử lý các tiêu chí của những gì cần tìm. Trong trường hợp này, nó chuyển một phương thức ProductGT10 khớp với chữ ký Predicate.

11

Sự kiện ràng buộc cho trình xử lý sự kiện thường là lần giới thiệu đầu tiên của bạn với đại biểu ... Bạn có thể không biết bạn đang sử dụng chúng vì đại biểu được gói trong lớp EventHandler.

0

Tìm kiếm nhanh trên google đã đưa ra điều này http://en.wikipedia.org/wiki/Delegation_pattern. Về cơ bản, bất cứ lúc nào mà bạn sử dụng một đối tượng chuyển tiếp đó là các cuộc gọi đến một đối tượng khác thì bạn đang ủy thác.

4

Nếu bạn muốn xem cách mẫu đại biểu được sử dụng trong mã thế giới thực, hãy xem xét kỹ hơn Cocoa trên Mac OS X. Cocoa là bộ công cụ giao diện người dùng ưa thích của Apple để lập trình trong Mac OS X và được mã hóa Mục tiêu C. Nó được thiết kế sao cho mỗi thành phần giao diện người dùng được dự định được mở rộng thông qua ủy quyền thay vì phân lớp hoặc các phương tiện khác.

Để biết thêm thông tin, tôi khuyên bạn nên xem Apple phải nói gì về đại biểu here.

15

Một sử dụng chung của các đại biểu cho Danh sách chung là thông qua các đại biểu hành động (hoặc tương đương giấu tên của nó) để tạo ra một dòng hoạt động foreach:

myList.Foreach(i => i.DoSomething()); 

Tôi cũng tìm thấy các đại biểu Predicate khá hữu ích trong việc tìm kiếm hoặc tỉa a Danh sách:

myList.FindAll(i => i.Name == "Bob");  
myList.RemoveAll(i => i.Name == "Bob"); 

Tôi biết bạn không yêu cầu mã, nhưng tôi thấy dễ dàng hơn để thể hiện tính hữu dụng của nó qua mã. :)

4

Tôi đã có dự án sử dụng win32 Python.

Vì nhiều lý do, một số mô-đun đã sử dụng odbc.py để truy cập vào DB và các mô-đun khác - pyodbc.py.

Đã xảy ra sự cố khi chức năng cần được cả hai loại mô-đun sử dụng. Nó có một đối tượng kết nối được truyền cho nó như một đối số, nhưng sau đó nó phải biết sử dụng dbi.dbiDate hoặc datetime để biểu diễn thời gian.

Điều này là do odbc.py mong đợi, dưới dạng giá trị trong câu lệnh SQL, ngày tháng là dbi.dbiDate trong khi pyodbc.py dự kiến ​​giá trị ngày giờ.

Một biến chứng nữa là các đối tượng kết nối được tạo bởi odbc.py và pyodbc.py không cho phép một đối tượng đặt trường bổ sung.

Giải pháp của tôi là bọc các đối tượng kết nối được trả về bởi odbc.odbc (...) và pyodbc.pyodbc (...) bởi một lớp đại biểu, trong đó có hàm thời gian biểu diễn mong muốn làm giá trị của trường bổ sung và ủy nhiệm tất cả các yêu cầu trường khác cho đối tượng kết nối ban đầu.

3

Tôi có cùng câu hỏi với bạn và truy cập trang web này để có câu trả lời.

Rõ ràng, tôi không hiểu rõ hơn dù tôi đã lướt qua các ví dụ về chủ đề này.

Tôi tìm thấy một sử dụng tuyệt vời cho các đại biểu bây giờ mà tôi đọc:http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx

này có vẻ rõ ràng hơn cho người sử dụng mới vì hình thức là phức tạp hơn nhiều để vượt qua giá trị so với các trang web ASP.NET với POST/GET (QueryString) ..

Về cơ bản, bạn xác định đại biểu cần "TextBox văn bản" làm thông số.

// Form1

// Class Property Definition 
public delegate void delPassData(TextBox text); 


// Click Handler 
private void btnSend_Click(object sender, System.EventArgs e) 
{ 
    Form2 frm= new Form2(); 
    delPassData del=new delPassData(frm.funData); 
    del(this.textBox1); 
    frm.Show(); 
} 

// Tóm tắt: Xác định đại biểu, nhanh chóng lớp Form2 mới, chuyển nhượng Fundata() để giao, vượt qua trong textbox của bạn để các đại biểu. Hiển thị biểu mẫu.

// Form2

public void passData(TextBox txtForm1) 
{ 

    label1.Text = txtForm1.Text; 
} 

// TÓM TẮT: Đơn giản chỉ cần lấy TextBox txtForm1 như các thông số (theo quy định tại đại biểu của bạn) và gán nhãn văn bản để văn bản textbox của.

Tôi hy vọng điều này soi sáng một số sử dụng trên các đại biểu :) ..

+0

Hoặc phương thức lớp Form2 cần phải được đặt tên là funData (thay vì passData) hoặc gán hàm Form1 cần phải được đặt tên là frm.passData (thay vì frm.funData). – ethan

139

Như đã nêu trong "Learning C# 3.0: Master the fundamentals of C# 3.0"

Kịch bản chung: Khi một người đứng đầu nhà nước chết, Tổng thống Hoa Kỳ thường không không có thời gian để tham dự tang lễ cá nhân. Thay vào đó, ông cử một đại biểu. Thông thường, đại biểu này là Phó Chủ tịch, nhưng đôi khi VP không khả dụng và Chủ tịch phải gửi một người khác, chẳng hạn như Bộ trưởng Ngoại giao hoặc ngay cả Đệ nhất phu nhân. Anh ta không muốn “cứng rắn” quyền hạn được ủy quyền của mình cho một người độc thân; anh ta có thể ủy quyền trách nhiệm này cho bất kỳ ai có thể thực thi giao thức quốc tế chính xác.

Chủ tịch xác định trước trách nhiệm sẽ được giao (tham dự tang lễ), thông số nào sẽ được chuyển (lời chia buồn, từ), và giá trị nào ông hy vọng sẽ quay lại (ý chí tốt). Sau đó, ông chỉ định một người cụ thể cho trách nhiệm được ủy quyền đó tại số "thời gian chạy" khi quá trình tổng thống của ông diễn ra.

Trong Kịch bản chương trình: Bạn thường phải đối mặt với tình huống mà bạn cần phải thực hiện một hành động cụ thể, nhưng bạn không biết trong trước đó phương pháp, hoặc thậm chí có đối tượng, bạn sẽ muốn kêu gọi để thực hiện nó.

Ví dụ: Nút có thể không biết đối tượng hoặc đối tượng nào cần được thông báo. Thay vì kết nối nút đến một đối tượng cụ thể , bạn sẽ kết nối nút với một đại biểu và sau đó giải quyết ủy quyền cho một phương thức cụ thể khi chương trình thực thi.

+1

Tại sao không đơn giản sử dụng các hàm ẩn danh/lambdas? – Pacerier

+5

@Pacerier Đây là câu trả lời trễ và bạn có thể đã phát hiện ra câu trả lời, nhưng vì lợi ích của các độc giả khác, những người tìm thấy điều này: một chức năng ẩn danh là một loại đại biểu. – Anthony

+8

@ Anthony + Pacerier: Một phương pháp anoymous KHÔNG phải là đại biểu. Một phương thức nặc danh là một đoạn mã. Một đại biểu là một con trỏ trỏ đến đoạn mã đó. Bạn không thể có một phương pháp anoymous mà không có một đại biểu chỉ vào nó, nếu không nó sẽ không bao giờ được gọi. Một lambda là một toán tử, được sử dụng để xây dựng các biểu thức lambda. Biểu thức Lambda chủ yếu là kết quả trong các phương pháp anoymous sẽ được chỉ định bởi ... một đại biểu. –

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