我想让这句话难以理解的主要原因是这段话:
但是通过继承,继承的操作总是可以通过 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 实例并访问它的成员。根据您使用的语言,您的里程可能会有所不同。
因此,委托实际上是关于绑定上下文,而不仅仅是转发方法调用。最后一次引用维基百科页面:
请注意,“委托”通常用于泛指转发的独特概念,其中发送对象仅使用接收对象上的相应成员,在接收对象的上下文中评估,而不是原始对象。