「デレゲーション」って言葉(今日の日記の見出し)で思い出したことが……:
どこかで、メソッド呼び出し/メッセージ・パッシングにおけるデレゲーションとフォーワーディングは違うんだ、という話を読んだことがあります。どこだかは忘れた。
JavaScriptだと、この違いをわかりやすく説明できます。
Barクラス(「クラスもどきの継承もどき」の意味での「クラス」)のオブジェクトが、目的(target)のFooクラス・オブジェクトにデレゲート/フォーワードするコードはこんな感じ:
/*
* Foo
*/
function Foo(name) {
this.name = name;
}Foo.prototype.hello = function() {
print("Hello, my name is " + this.name + ".");
};/*
* Bar
*/
function Bar(name) {
this.name = name;
}
Bar.target = new Foo("John");Bar.prototype.delegatedHello = function() {
(Bar.target.hello).apply(this, []);
};Bar.prototype.forwardedHello = function() {
Bar.target.hello();
};
この状況で実験:
js> var bob = new Bar("Bob")
js> bob.delegatedHello()
Hello, my name is Bob.
js> bob.forwardedHello()
Hello, my name is John.
js>
デレゲーションとは相手(target)の「力を借りる」ことで、フォーワーディングとは相手に「まる投げする」ことですね。
「力を借りる」ときは、メソッド実行コード(計算/処理)だけは借りるけど、thisが指すモノは自分自身。一方、「まる投げ」では、相手の“ところ”で相手の計算/処理が走ります。
このような言葉の使い分けが一般的かどうかは知らないけど、違いはあるでしょ。