java中的继承和委托有什么区别

时间:2012-11-06 06:29:25

标签: java

  

可能重复:
  Prefer composition over inheritance?

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();
     }

   }

2 个答案:

答案 0 :(得分:23)

当你委托时,你只是在调用一些知道必须做什么的课程。你真的不关心 它是怎么做的,所有你关心关于你所调用的类知道需要做什么。

如果我是你,虽然我会创建一个界面,并将其命名为IPrinter(或沿着这些行的某些内容),其中有一个名为print的方法。然后,我将RealPrinter实现此接口。最后,我会将此行更改为RealPrinter p = new RealPrinter();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();
    }
}

答案 1 :(得分:6)

Inheritence使用java编译器的类型系统隐式包含来自其他地方的代码,使用委托显式实现callout。

继承仅限于单个父类(和祖先),但有时在代码进行的地方不明显;委托不太优雅,但您可以从多个其他类中引入功能,并且流程清晰可见。

就调用外部函数而言,由于这个原因,委托通常是首选,因此应该为你想要实现其行为特别类似于基类的类保留继承,因此它基本上可以被处理作为其他代码的基类的一个实例(即它是多态的)。