当一个类'将一个任务委托给另一个类时:
“委托人”类是否必须将自己传递给“委派”类才能将其计为委派?或者简单地“转移责任”,没有一个类将自己作为参数传递?
答案 0 :(得分:2)
不,它不必将自己传递给委托。实际上,委托有时在大型类中用于抽象而不传递特定函数。
例如,如果我有一个bakery
类,并且我想从外部执行bakery.sellALoafOfBread()
,那么它可能看起来像bakery
类来处理它。实际上,由面包店委派的cashier
课程完成了任务。它return
计算了一条面包的成本,而bakery
类将这笔钱加到了每月的利润中。
但是,如果委托实际上绑定在大类中,则大对象可能希望传递指针或引用。这样,小类可以访问大类的变量和其他成员。
来自Wikipedia的示例:
class RealPrinter { // the "delegate"
void print() {
System.out.println("something");
}
}
class Printer { // the "delegator"
RealPrinter p = new RealPrinter(); // create the delegate
void print() {
p.print(); // delegation
}
}
public class Main {
// to the outside world it looks like Printer actually prints.
public static void main(String[] args) {
Printer printer = new Printer();
printer.print();
}
}
看,没有通过!
答案 1 :(得分:0)
当我们说一些X设计模式时,我们引用了GoF书中描述的模式。所以简而言之,就像上面解释的@blue-ice一样。
但原始术语<强>在OOP中的授权是指将问题的一部分传递给另一个对象,而不能传递给另一个对象。因此,最终完成任务的对象将需要对委托的对象进行引用,因为它需要访问该对象的某些部分。
MIT OOP delegation paper更详细地解释了这一点。但如果您只想要论文摘要,可以查看这篇文章The Gang Of Four Is Wrong And You Don't Understand Delegation。
文章主要部分说:
利伯曼用GUI绘图工具对此进行了讨论。这是授权背后的关键理念:
当笔将绘图消息委托给原型笔时,它会说“我不知道如何处理绘制消息。如果可以的话,我希望你能为我回答,但如果你有任何进一步的问题,比如我的x变量的价值是什么,或者需要做什么,你应该回过头来问我。“如果有消息进一步委托,所有关于变量值或回复消息的请求的问题都被推断到首先委派消息的对象。
简而言之,当您向对象发送消息时,它具有“自我”概念,可以在其中找到属性和其他方法。当该对象委托给另一个对象时,对“self”的任何引用始终引用原始邮件收件人。总是