答案 0 :(得分:1)
我认为让这个难以理解的主要原因是这段话:
但是对于继承,继承的操作总是可以通过C ++中的
this
成员变量和Smalltalk中的self
来引用接收对象。为了通过委托获得相同的效果,接收器将自己传递给委托,让委托操作引用接收者。
Quoting Wikipedia(强调我的):
在委托中,对象通过委托给第二个对象(委托)来处理请求。委托是辅助对象, 但具有原始上下文 。通过对委派的语言级支持,这通过委托中的
self
引用原始(发送)对象而不是委托(接收对象)来隐式完成。
实际上self
或this
或current
或caller
是否特定于语言。这意味着在支持委派的语言中,以下方法可行:
Window
int width: 640
int height: 480
Rectangle rectangle: new Rectangle()
int Area(): rectangle.Area()
Rectangle
int Area(): self.width * self.height
Window window: new Window()
print window.Area()
这将打印640x480的结果,因为委托在Window实例的上下文中执行Area,尽管代码在Rectangle中。也就是说,它使用从窗口到self
的宽度和高度。
在不支持此自动上下文传递的语言中,您需要将调用方传递给代理:
Window
int width: 640
int height: 480
Rectangle rectangle: new Rectangle()
int Area(): rectangle.Area(this)
Rectangle
int Area(context): context.width * context.height
Window window: new Window()
print window.Area()
调用Area()
时,我们将Window实例传递给委托(通过this
)。然后委托访问宽度和高度成员,通过显式传递的参数进行计算。
请注意,上面的伪语言不会对类型或可见性等内容做出任何假设,我们假设我们可以简单地传递这样的Windows实例并访问它的成员。根据您的语言使用情况,您的里程可能会有所不同。
因此,授权实际上是关于绑定上下文而不仅仅是转发方法调用。最后一次引用维基百科页面:
请注意,“委托”通常用于指代转发的不同概念,其中发送对象仅使用接收对象上的相应成员,在接收对象的上下文中进行评估,而不是原始对象。 / p>
答案 1 :(得分:0)
就模式而言以及代码的外观,类图很好地展示了它:两个类,Window和Rectangle。
或许值得你拿到实际的书(如果你还没有用纸),并阅读前面描述图表的章节之一。或者也许我错了,并且它不在那本书中,而是获得了另外一本OOAD / OOP书籍,解释这些图表的内容或如何使用它们。
如果到目前为止这看起来很愚蠢:如果它值得,而且我认为这也是由GoF创造的,那么这将有利于聚合而不是继承"这本身就值得引起共鸣。如果你们所有人都没有,我们还没有,为什么不这样做呢?以不同的编写代码/概念来讨论一些具体的例子。
参见: