Java中继承和委托的区别是什么?

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

   }

请参考例如https://dev59.com/JHRA5IYBdhLWcg3wxA9N或在互联网上搜索“继承委托”... - home
2
或者更好的是:https://dev59.com/KXVD5IYBdhLWcg3wNY5Z - home
2个回答

26
当您委托任务时,您只是调用了一个已知必须完成任务的类。您并不关心它是如何完成任务的,您关心的是您所调用的类知道需要做什么。
如果我是您,我会创建一个名为IPrinter(或类似名称)的接口,并在其中定义一个名为print的方法。然后我会让RealPrinter实现这个接口。最后,我会将这一行:RealPrinter p = new RealPrinter(); 更改为:IPrinter p = new RealPrinter();
由于RealPrinter 实现了IPrinter接口,我就可以确定它具有print方法。然后我可以使用这个方法通过委托到适当的类来更改应用程序的打印行为。
这通常提供了更大的灵活性,因为您不会将行为嵌入到特定的类中,而是留给另一个类去处理。
在这种情况下,要更改应用程序的打印行为,您只需要创建另一个实现IPrinter接口的类,然后将这行代码更改为: 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();
    }
}

6
继承使用Java编译器的类型系统隐含地从其他地方包含代码,而委托则需要显式实现调用。
继承仅限于单个父类(和祖先),但有时您的代码去向可能不明确;委托不太优雅,但是您可以从多个其他类中引入功能,并且流程清晰可见。
就调用外部函数而言,出于这个原因,通常更喜欢使用委托,应该将继承保留给想要实现其行为与基类类似的类的情况,因此其他代码可以将其视为基类的实例(即它是多态的)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接