哪些真实世界的地方需要代表?我很好奇这种方法是最佳解决方案的情况或模式。无需代码。
答案 0 :(得分:148)
如"Learning C# 3.0: Master the fundamentals of C# 3.0"
中所述一般情景:当国家元首去世时,美国总统通常没有时间参加葬礼 亲身。相反,他派遣一名代表。这个代表经常是 副总统,但有时副总裁不在,而且 总统必须派遣其他人,如国务卿或 甚至是第一夫人。他不想“硬连线”他的委托 对一个人的权力;他可能会将此责任委托给 任何能够执行正确的国际协议的人。
总统事先确定将授予哪些责任 (参加葬礼),将通过哪些参数(哀悼, 善意的话),他希望得到什么价值(善意)。然后他 指定一个特定的人担任该委托的职责 随着总统任期的进行,“运行时间”。
在编程场景中您经常遇到需要执行特定操作的情况,但您不知道 推进您想要调用的方法,甚至是哪个对象 执行它。
例如:按钮可能不知道需要通知哪个或哪些对象。而不是将按钮连接到特定的 对象,您将按钮连接到委托,然后解决 在程序执行时委托给特定方法。
答案 1 :(得分:32)
委托是一种命名类型,用于定义特定类型的方法。正如类定义列出了它定义的给定类型对象的所有成员一样,委托为它定义的方法类型布置了方法签名。
基于此语句,委托是一个函数指针,它定义了该函数的外观。
代表的真实世界应用程序的一个很好的例子是Predicate。在链接的示例中,您将注意到Array.Find使用数组进行搜索,然后使用谓词来处理要查找的内容的条件。在这种情况下,它传递一个与Predicate签名匹配的方法ProductGT10。
答案 2 :(得分:16)
通用列表的委托的一个常见用法是通过Action委托(或其匿名等价物)来创建单行foreach操作:
myList.Foreach( i => i.DoSomething());
我还发现Predicate委托在搜索或修剪List时非常有用:
myList.FindAll( i => i.Name == "Bob");
myList.RemoveAll( i => i.Name == "Bob");
我知道您说不需要代码,但我发现通过代码表达它的用处更容易。 :)
答案 3 :(得分:12)
将事件绑定到事件处理程序通常是您对代理人的第一次介绍......您可能甚至不知道您正在使用它们,因为委托包含在EventHandler类中。
答案 4 :(得分:4)
如果您有兴趣了解如何在真实代码中使用Delegate模式,那么Mac OS X上的Cocoa就是最佳选择.Cocoa是Apple在Mac OS X下编程的首选UI工具包,并在Objective中编码C.它的设计使得每个UI组件都可以通过委托而不是子类或其他方式进行扩展。
有关详细信息,我建议您查看Apple对代表here的评论。
答案 5 :(得分:4)
我有一个使用win32 Python的项目。
由于种种原因,一些模块使用odbc.py来访问数据库,以及其他模块 - pyodbc.py。
两种模块都需要使用某个功能时出现问题。它有一个连接对象作为参数传递给它,但它必须知道是否使用dbi.dbiDate或datetime来表示时间。
这是因为odbc.py期望,作为SQL语句中的值,日期为dbi.dbiDate,而pyodbc.py为datetime值。
另一个复杂因素是odbc.py和pyodbc.py创建的连接对象不允许设置其他字段。
我的解决方案是用委托类包装odbc.odbc(...)和pyodbc.pyodbc(...)返回的连接对象,该委托类包含所需的时间表示函数作为额外字段的值,并将所有其他字段请求委托给原始连接对象。
答案 6 :(得分:4)
我和你有同样的问题,然后到这个网站寻求答案。
显然,即使我浏览了这个帖子中的例子,我也没有更好地理解它。
我现在认为代理人很有用: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx
对于新用户来说这似乎更为明显,因为与使用POST / GET(QueryString)的ASP.NET网站相比,Forms传递值要复杂得多。
基本上,您定义一个以“TextBox text ”作为参数的委托。
// 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();
}
// SUMMARY:定义委托,实例化新的Form2类,将funData()函数分配给委托,将textBox传递给委托。显示表格。
// Form2
public void passData(TextBox txtForm1)
{
label1.Text = txtForm1.Text;
}
//摘要:只需将TextBox txtForm1作为参数(在委托中定义)并将标签文本分配给textBox的文本。
我希望这能激发对代表的使用:) ..
答案 7 :(得分:0)
快速谷歌搜索提出了这个http://en.wikipedia.org/wiki/Delegation_pattern。基本上,只要你使用一个将它的调用转发给另一个对象的对象,你就可以委托了。