web-dev-qa-db-ja.com

Java OOP

「継承よりも構成を優先する」についての記事を読んでおり、転送と委任について聞いた。別のものを検索した後、私はいくつかのソースを見つけました:

しかし、これらの例は私をより混乱させています。たとえば、次のコードスニペットでは、

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のサンプルコードを使用した、転送と委任の「実際の」例とは何ですか。

4
nhoxbypass

あなたがあなたの回答で示したように、私は通常委任について知っていましたが、転送については知りませんでした。

短い答え:プリンターコードスニペットで提供したのはDelegationです。その上、与えられたWikipediaの例 1 も、もう1つの受け入れ可能な答えです。

長い答え:

説明を分解して、用語や概念を理解しやすくします。

与えられた用語をよりよく説明するシンプルなビジュアル:

=========================
|   WRAPPER(Sending)    |
|   +---------------+   |
|   +   WRAPPEE     +   |
|   +   (Receiving) +   |
|   +---------------+   |
|                       |
=========================

委任

あるオブジェクト(受信者)のメンバーを別の元のオブジェクト(送信者)のコンテキストで評価する。 2

これは、プリンターの例からわかることを示しています。ラッパー

転送

送信側オブジェクトが別のオブジェクトの対応するメンバーを使用し、受信側オブジェクトが元の送信側オブジェクトの知識を持たない、しばしば混乱する手法。 2

さらに、Wikipediaによると、委任と転送のわずかな違いは、「自己」キーワードの制限方法です。

これらは、受信オブジェクトで自分が何を参照するか(正式には、受信オブジェクトのメソッドの評価環境で)が異なります。委任では送信オブジェクトを参照し、転送では受信オブジェクトを参照します。

さらに、定義は次のようになります。

転送と委任の違いは、ラッパーを介して呼び出されたときの、ラピー内のselfパラメーターのバインディングです。委任を使用すると、selfパラメータはラッパーにバインドされます(thisはJavaの 'this'キーワードで使用できるものです)。転送すると、ラッパーにバインドされます。--

本質的に、転送のために、受信オブジェクトは送信オブジェクトの詳細を知らないはずです。このスタックオーバーフローの回答 4 は、「this」および「self」キーワードを詳細に説明しています= JavaおよびPythonこれにより、転送の内訳をある程度理解できます。

ただし、委任と転送のコンテキストでは、さまざまな回答もわかりました。意見が混在する可能性があると思います 56

https://en.wikipedia.org/wiki/Delegation_(object-oriented_programming)#Language_support_for_delegation

https://en.wikipedia.org/wiki/Delegation_(computing)

https://en.wikipedia.org/wiki/Forwarding_(object-oriented_programming)#Delegation

https://stackoverflow.com/a/37657923/195868

https://stackoverflow.com/questions/7816011/in-oop-what-is-forwarding-and-how-is-it-different-from-delegation

https://stackoverflow.com/questions/1384426/distinguishing-between-delegation-composition-and-aggregation-Java-oo-design

2
Tugrul ASLAN