任何人都可以使用一些现实生活过程的类比来解释它们 - 例如经营棒球队、咖啡店或汽车修理店 - 任何有意义的事情吗? 比如我们甚至不谈 CODE、SYNTAX 或编程——我看过很多这样的帖子,但没有一个真正适合我——我们能先谈谈概念吗?
好像我什至不明白为什么我们有它们,它们有什么优势等等。
向我展示在有和没有委托(delegate)的情况下运行的流程的真实世界类比,这样我就能明白是什么让它们如此有用和伟大。
然后我们就可以编码出来了。
(仅供引用,我特别感兴趣的是 Objective-C/iPhone 应用程序开发实现 - 但我真的认为首先从概念上理解这一点更为重要。)
提前致谢!
最佳答案
并非所有编码抽象都有现实生活中的等价物。例如,您很难找到分页内存的真实类比。因此,我不会做现实生活中的类比,而是要给你一个现实生活中的案例,说明你为什么需要它们。
首先,动词 to delegate 的实际定义(来自牛津词典):
entrust (a task or responsibility) to another person, typically one who is less senior than oneself : he delegates routine tasks | the power delegated to him must never be misused.
委托(delegate)是被委托(delegate)了责任的对象,因为从设计的角度来看,让一个类完成所有工作是没有意义的。
假设您有一个 UI 表类。您想让它可重用以显示多种数据:这意味着,在大多数情况下,您不能将它与模型本身联系起来。例如,如果您将 UI 表专门用于显示 Album 对象(带有名称、艺术家等),那么您将无法重用它来显示 File 对象(带有所有者、文档类型)等):您必须编辑类(class)以使其适合。这会重复很多代码,所以你应该找到另一种机制。这导致了一个问题:如果不允许绑定(bind)到数据类,它如何显示任何类型的数据?
解决方案是拆分获取数据和显示数据的责任。由于您的表需要数据来显示它,但由于它对您的模型一无所知,因此无法自行发现它,因此它应该将此职责委托(delegate)给另一个类,专门为此目的而设计,并交由它处理信息以表格将知道如何使用的一般形式返回。
这意味着您将拥有另一个类,该类将响应表对象将使用的一定数量的方法,就好像它是其核心行为的一部分(例如,委托(delegate)上的一个方法来获取表对象的名称列,另一个获取特定行等)。对于一个具体的例子,你可以查找 NSTableViewDelegate
协议(protocol)引用:这些是 NSTableView
可以调用其委托(delegate)以获取有关各种事物或自定义行为的信息的方法。 (tableView:
参数基本上每个方法都标识调用该方法的 TableView 。它经常被忽略,因为存在许多 TableView 委托(delegate)类来支持单个 TableView 。)
委托(delegate)是简单地“知道得更好”的对象。您的 UI 表不知道如何获取它需要的内容,但它有一个“知道得更多”的委托(delegate),因此它可以从中请求数据。
您也可以使用这种模式来处理事件:例如,当一个 View 被点击时,它不知道该做什么,但也许它有一个知道该做什么的委托(delegate)。
换句话说,委托(delegate)是扩展类行为而无需修改类或子类化的几种方法之一。
关于iphone - 委托(delegate)——他们到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6148148/