首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代表们--他们到底是什么?

代表们--他们到底是什么?
EN

Stack Overflow用户
提问于 2011-05-27 13:23:49
回答 6查看 448关注 0票数 7

有没有人可以用现实生活中的一些过程来解释它们--比如经营一支棒球队,一家咖啡店,或者一家汽车修理店--任何有意义的事情?就像让我们甚至不要谈论代码、语法或编程-我已经看过很多这样的帖子,但它们都没有真正为我做-我们能不能先谈谈概念?

就像我甚至不明白为什么我们有他们,他们有什么优势,等等。

向我展示有委托和无委托运行的流程的真实类比,这样我就可以看到是什么让它们如此有用和伟大。

然后我们可以把它编码出来。

(仅供参考,我的具体兴趣是Objective-C/iPhone应用程序开发实现-但我真的认为首先从概念上理解这一点要重要得多。)

提前感谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-05-27 14:55:38

它们到底是什么?

专家

顾客:嗨,你修好我的车了吗?

员工:我估计不到一个小时我们就有机会看一看了。准备好了我会打电话给你的。

顾客:我已经等了30分钟了,我真的很着急!

员工:我们每年的这个时候都很忙。

顾客:你看起来并不忙,你一直在前台!

雇员:我不是技工。我是经理。你还想让我帮你修刹车吗?

经理擅长做他所做的事情;他为客户详细说明问题,订购闪光液,制定时间表,并发工资。虽然他喜欢汽车,而且对汽车了解很多,但他不是修理汽车的专家。经理能在店里做很多事情,但技师才是修理顾客刹车所需的专业知识。

使用委托的一个最常见的原因是为了避免子类化(这就像是把经理送到学校去当机械师--一种看起来很像多重继承的类比)。当子类化可以用于专门化时,通常可以使用委托。委托是一种更松散的联系,其中(在良好的设计中)一个对象完成所有或大部分职责,但通常将其职责的专门部分留给其他实现(委托)。

票数 5
EN

Stack Overflow用户

发布于 2011-05-27 13:41:32

并不是所有的编码抽象都有现实生活中的等价物。例如,您很难找到一个现实生活中的分页内存的类比。因此,我不会做现实生活中的类比,而是给你一个现实生活中的案例,告诉你为什么你需要它们。

首先,让我们来看看动词的实际定义(出自牛津词典):

将(一项任务或责任)委托给另一个人,通常是级别比自己低的人:他委派日常任务|委派给他的权力永远不能被滥用。

委托是被委托一个职责的对象,因为从设计的角度来看,让一个类来做所有的工作是没有意义的。

假设您有一个UI表类。您希望使其可重用来显示多种类型的数据:这意味着,在很大程度上,您不能将其绑定到模型本身。例如,如果您创建的UI表专门用于显示专辑对象(带有名称、艺术家等)。这样就不能重用它来显示File对象(具有所有者、文档类型等):您必须编辑该类以使其适合。这将复制大量代码,因此您应该找到另一种机制。这导致了一个问题:如果不允许它绑定到数据类,它如何显示任何类型的数据?

解决方案是将获取数据和显示数据的责任分开。由于您的表需要数据来显示它,但由于它对您的模型一无所知而无法自己发现它,因此它应该将这一职责委托给另一个专门为此目的而设计的类,并让它以表将知道如何使用的一般形式返回信息。

这意味着您将拥有另一个类,该类将响应一定数量的方法,表对象将使用这些方法,就好像它是其核心行为的一部分(例如,委托上的一个方法用于获取列名,另一个方法用于获取特定行,等等)。对于一个具体的示例,您可以查找NSTableViewDelegate协议参考:这些是NSTableView可以在其委托上调用的方法,以获取有关各种事物或自定义行为的信息。( tableView:参数基本上每个方法都有标识调用该方法的表视图。它通常被忽略,因为存在许多表视图委托类来支持单个表视图。)

委托是简单的“知道得更好”的对象。您的UI表不知道如何获取它所需的内容,但它有一个“更了解”的委托,因此它可以向它请求数据。

您还可以使用此模式来处理事件:例如,当单击一个视图时,它不知道该做什么,但它可能有一个知道该做什么的委托。

换句话说,委托是扩展类行为的几种方法之一,而不需要修改它或子类化它。

票数 8
EN

Stack Overflow用户

发布于 2011-05-27 13:40:40

委托是一种设计模式。在Cocoa和Cocoa Touch中,某些框架类实现了这种模式,因此您不需要子类来修改它们的行为。

委托的一个典型例子是决定是否应该关闭窗口。当用户点击close按钮时,窗口的代理将得到一个-windowShouldClose:,如果窗口不包含任何可能要保存的编辑,它可以返回YES,或者如果您想让用户在关闭窗口之前有机会保存文档,则返回NO。

在另一个示例中,NSStream对象接收数据,但它不实现任何处理该数据的行为。它使用委托模式;当数据可供读取时,它会向其委托发送一条消息,告诉它数据可用。然后,代理可以继续对传入的数据进行操作,并告诉NSStream继续侦听更多数据,或者关闭连接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6148148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档