109

现实世界中有哪些地方需要代表?我很好奇这种方法是最佳解决方案的情况或模式。无需代码。

4

8 回答 8

156

“学习 C# 3.0:掌握 C# 3.0 的基础知识”中所述

一般情景: 当国家元首去世时,美国总统通常没有时间亲自参加葬礼。相反,他派遣了一名代表。通常这个代表是副总统,但有时副总统不在,总统必须派其他人,比如国务卿甚至第一夫人。他不想将他的授权“硬连线”给一个人;他可以将这一责任委托给任何能够执行正确的国际协议的人。

总统预先定义了将被委派的责任(参加葬礼)、传递的参数(吊唁、客气话)以及他希望得到的价值(善意)。然后,随着他的总统任期的进行,他会在“运行时”分配一个特定的人来承担该委派的职责。

在编程场景中: 您经常遇到需要执行特定操作的情况,但您事先不知道要调用哪个方法,甚至哪个对象来执行它。

例如: 按钮可能不知道需要通知哪个或哪些对象。您无需将按钮连接到特定对象,而是将按钮连接到委托,然后在程序执行时将该委托解析为特定方法。

于 2013-06-26T10:43:31.983 回答
35

委托是一种命名类型,它定义了一种特定类型的方法。正如类定义为它定义的给定类型的对象列出所有成员一样,委托为其定义的方法类型列出方法签名。

基于此声明,委托是一个函数指针,它定义了该函数的外观。

委托的真实世界应用的一个很好的例子是Predicate。在链接的示例中,您会注意到Array.Find使用数组进行搜索,然后使用谓词来处理查找内容的条件。在这种情况下,它传递一个与 Predicate 签名匹配的方法 ProductGT10。

于 2008-08-28T02:12:21.983 回答
18

通用列表的委托的一种常见用途是通过 Action 委托(或其匿名等价物)创建单行 foreach 操作:

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

我还发现 Predicate 委托在搜索或修剪列表时非常有用:

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

我知道你说不需要代码,但我发现通过代码来表达它的用处更容易。:)

于 2008-08-28T02:32:42.403 回答
13

将事件绑定到事件处理程序通常是您对委托的第一次介绍……您甚至可能不知道您正在使用它们,因为委托被包装在 EventHandler 类中。

于 2008-08-28T02:00:18.393 回答
6

我和你有同样的问题,然后去这个网站寻求答案。

显然,即使我浏览了这个线程上的示例,我也没有更好地理解它。

现在我读到: http ://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx,我发现代表很有用

这对于新用户来说似乎更明显,因为 Forms 传递值比使用 POST/GET (QueryString) 的 ASP.NET 网站要复杂得多。

基本上,您定义了一个将“TextBox text作为参数的委托。

//表格1

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

// 摘要:定义委托,实例化新的 Form2 类,将 funData() 函数分配给委托,将您的文本框传递给委托。显示表格。

//表格2

public void passData(TextBox txtForm1)
{

     label1.Text = txtForm1.Text;
}

// 摘要:只需将 TextBox txtForm1 作为参数(在您的委托中定义)并将标签文本分配给 textBox 的文本。

我希望这能启发对代表的一些使用:) ..

于 2010-05-10T08:42:55.200 回答
5

如果您有兴趣了解委托模式在实际代码中的使用方式,那就看看 Mac OS X 上的 Cocoa。Cocoa 是 Apple 首选的用于在 Mac OS X 下编程的 UI 工具包,它是用 Objective C 编码的。旨在使每个 UI 组件都旨在通过委托而不是子类化或其他方式进行扩展。

有关更多信息,我建议您在此处查看 Apple 对代表的评价。

于 2008-08-28T02:30:16.043 回答
5

我有一个使用 win32 Python 的项目。

由于各种原因,一些模块使用odbc.py来访问数据库,而其他模块-pyodbc.py。

当两种模块都需要使用一个功能时,就会出现问题。它有一个连接对象作为参数传递给它,但它必须知道是使用 dbi.dbiDate 还是 datetime 来表示时间。

这是因为 odbc.py 预期,作为 SQL 语句中的值,日期为 dbi.dbiDate,而 pyodbc.py 预期日期时间值。

更复杂的情况是 odbc.py 和 pyodbc.py 创建的连接对象不允许设置额外的字段。

我的解决方案是用委托类包装 odbc.odbc(...) 和 pyodbc.pyodbc(...) 返回的连接对象,该类包含所需的时间表示函数作为额外字段的值,并且委托对原始连接对象的所有其他字段请求。

于 2008-09-16T14:39:18.817 回答
1

一个快速的谷歌搜索想出了这个http://en.wikipedia.org/wiki/Delegation_pattern。基本上,只要您使用将调用转发给另一个对象的对象,那么您就是在委派。

于 2008-08-28T02:03:27.153 回答