java中的inheritance和委托有什么区别

可能重复:
喜欢构成而不是inheritance?

java中的inheritance和委托有什么区别?

如何在我的项目中使用以下示例? 请你帮我指导一下。 我知道inheritance但对代表团知之甚少。 所以,请给出正确的理由。 我为什么要用这个?

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

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

如果我是你,虽然我会创建一个接口,并将其命名为IPrinter (或沿着这些行的东西),其中有一个名为print方法。 然后我会让RealPrinter实现这个接口。 最后,我会改变这一行: RealPrinter p = new RealPrinter(); 对此: IPrinter p = new RealPrinter()

由于IPrinter实现了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(); } } 

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

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

就调用外部函数而言,由于这个原因,委托通常是首选,因此应该为希望实现其行为特别类似于基类的类的情况保留inheritance,因此它基本上可以被视为实例其他代码的基类(即它是多态的)。