「継承よりも構成を優先する」についての記事を読んでおり、転送と委任について聞いた。別のものを検索した後、私はいくつかのソースを見つけました:
しかし、これらの例は私をより混乱させています。たとえば、次のコードスニペットでは、
class RealPrinter { // the "receiver"
void print() {
System.out.println("Hello world!");
}
}
class Printer { // the "sender"
RealPrinter p = new RealPrinter(); // create the receiver
void print() {
p.print(); // calls the receiver
}
}
public class Main {
public static void main(String[] arguments) { // to the outside world it looks like Printer actually prints.
Printer printer = new Printer();
printer.print();
}
}
ウィキペディアはそれが転送であると言いましたが、GeeksForGeeksはそれが委任だと言いました。それでどちらが正しいですか?
もう1つは、ウィキペディアの例で、delegate
キーワードであるprivate delegate A a;
を使用して委任を宣言していることです。
また、Javaのサンプルコードを使用した、転送と委任の「実際の」例とは何ですか。
あなたがあなたの回答で示したように、私は通常委任について知っていましたが、転送については知りませんでした。
短い答え:プリンターコードスニペットで提供したのはDelegationです。その上、与えられたWikipediaの例 1 も、もう1つの受け入れ可能な答えです。
長い答え:
説明を分解して、用語や概念を理解しやすくします。
与えられた用語をよりよく説明するシンプルなビジュアル:
=========================
| WRAPPER(Sending) |
| +---------------+ |
| + WRAPPEE + |
| + (Receiving) + |
| +---------------+ |
| |
=========================
委任
あるオブジェクト(受信者)のメンバーを別の元のオブジェクト(送信者)のコンテキストで評価する。 2
これは、プリンターの例からわかることを示しています。ラッパー
転送
送信側オブジェクトが別のオブジェクトの対応するメンバーを使用し、受信側オブジェクトが元の送信側オブジェクトの知識を持たない、しばしば混乱する手法。 2
さらに、Wikipediaによると、委任と転送のわずかな違いは、「自己」キーワードの制限方法です。
これらは、受信オブジェクトで自分が何を参照するか(正式には、受信オブジェクトのメソッドの評価環境で)が異なります。委任では送信オブジェクトを参照し、転送では受信オブジェクトを参照します。
さらに、定義は次のようになります。
転送と委任の違いは、ラッパーを介して呼び出されたときの、ラピー内のselfパラメーターのバインディングです。委任を使用すると、selfパラメータはラッパーにバインドされます(thisはJavaの 'this'キーワードで使用できるものです)。転送すると、ラッパーにバインドされます。--
本質的に、転送のために、受信オブジェクトは送信オブジェクトの詳細を知らないはずです。このスタックオーバーフローの回答 4 は、「this」および「self」キーワードを詳細に説明しています= JavaおよびPythonこれにより、転送の内訳をある程度理解できます。
ただし、委任と転送のコンテキストでは、さまざまな回答もわかりました。意見が混在する可能性があると思います 5 、 6
https://en.wikipedia.org/wiki/Delegation_(computing)
https://en.wikipedia.org/wiki/Forwarding_(object-oriented_programming)#Delegation