我在哪里使用代表?

时间:2008-08-28 01:58:54

标签: oop design-patterns delegates

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

8 个答案:

答案 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。基本上,只要你使用一个将它的调用转发给另一个对象的对象,你就可以委托了。