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

既然RealPrinterimplements 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 回答