13

重複の可能性:
継承よりも構成を優先しますか?

javaの継承と委任の違いは何ですか?

私のプロジェクトで次の例を使用するにはどうすればよいですか? 委任で私を導いてください。継承については知っていますが、委任についてはあまり知りません。では、ちゃんとした理由をお願いします。なぜこれを使用する必要があるのですか?

 package com.m;

 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 Tester {

// to the outside world it looks like Printer actually prints.
     public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
     }

   }
4

2 に答える 2

25

デリゲートするときは、何をしなければならないかを知っているクラスを呼び出すだけです。それがどのように行われるかはあまり気にしません。気するのは、呼び出しているクラスが何をする必要があるかを知っていることだけです。

もし私があなただったら、インターフェースを作成し、それに名前を付けますIPrinter(またはそれらの線に沿った何か) print。次に、このインターフェイスをRealPrinter実装します。最後に、この行RealPrinter p = new RealPrinter();を this: に変更しますIPrinter p = new RealPrinter()

RealPrinterを実装しているので、メソッドIPrinterがあることは確かです。print次に、このメソッドを使用して、アプリケーションを適切なクラスに委譲することで、アプリケーションの印刷動作を変更できます。

これにより、特定のクラスに動作を埋め込むのではなく、別のクラスに任せることができるため、通常は柔軟性が向上します。

この場合、印刷に関するアプリケーションの動作を変更するには、 を実装する別のクラスを作成し、次の行を に変更するだけIPrinterです。IPrinter p = new RealPrinter();IPrinter p = new MyOtherPrinter();

public interface IPrinter {
    void print();
}

public class RealPrinter implements IPrinter {

    @Override
    public void print() {
        System.out.println("This is RealPrinter");
    }
}

public class RealPrinter2 implements IPrinter {

    @Override
    public void print() {
        System.out.println("This is RealPrinter2");
    }
}

public class Main {

    public static void main(String...arg){
        IPrinter printer  = new RealPrinter();
        printer.print();

        printer = new RealPrinter2();
        printer.print();
    }
}
于 2012-11-06T06:41:12.263 に答える
6

継承では、Java コンパイラの型システムを使用して、他の場所からのコードを暗黙的にインクルードし、委譲によってコールアウトを明示的に実装します。

継承は単一の親クラス (および祖先) に限定されますが、コードがどこに行くのかが明確でない場合があります。委譲はエレガントではありませんが、他の複数のクラスから機能を取り込むことができ、フローがはっきりと見えます。

外部関数の呼び出しに関する限り、委任は一般にこの理由で好まれます。継承は、動作が特に基本クラスに似ているクラスを実装する場合に予約する必要があるため、本質的にインスタンスとして扱うことができます。他のコードによる基底クラスの変更 (つまり、ポリモーフィックです)。

于 2012-11-06T08:11:38.917 に答える