📜  Java中的委托与继承

📅  最后修改于: 2022-05-13 01:54:45.900000             🧑  作者: Mango

Java中的委托与继承

Java编程中的继承是一个类获取另一个类的属性的过程。即,称为派生类或子类的新类接管了现有类(称为基类或超类或父类)的属性和行为。
委派只是将职责转嫁给某人/其他人。

  • 委托可以替代继承。
  • 委托意味着您使用另一个类的对象作为实例变量,并将消息转发给实例。
  • 在许多情况下,它比继承要好,因为它让您考虑转发的每条消息,因为实例属于已知类,而不是新类,而且它不会强迫您接受超类:你只能提供真正有意义的方法。
  • 委托可以被视为对象之间的关系,其中一个对象将某些方法调用转发给另一个对象,称为其委托。
  • 委托的主要优点是运行时的灵活性——委托可以在运行时轻松更改。但与继承不同的是,大多数流行的面向对象语言并不直接支持委托,并且它不利于动态多态性。

Java
// Java program to illustrate
// delegation
class RealPrinter {
    // the "delegate"
    void print()
    {
        System.out.println("The Delegate");
    }
}
 
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();
    }
}


Java
// Java program to illustrate
// Inheritance
class RealPrinter {
    // base class implements method
    void print()
    {
        System.out.println("Printing Data");
    }
} 3 // Printer Inheriting functionality of real printer
    class Printer extends RealPrinter {
 
    void print()
    {
        super.print(); // inside calling method of parent
    }
}
 
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();
    }
}


输出:

The Delegate

当你委托时,你只是在调用一些知道必须做什么的类。您并不真正关心它是如何做到的,您所关心的只是您所调用的类知道需要做什么。

使用继承的相同代码

Java

// Java program to illustrate
// Inheritance
class RealPrinter {
    // base class implements method
    void print()
    {
        System.out.println("Printing Data");
    }
} 3 // Printer Inheriting functionality of real printer
    class Printer extends RealPrinter {
 
    void print()
    {
        super.print(); // inside calling method of parent
    }
}
 
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();
    }
}

输出:

Printing Data

什么时候用什么?
以下是使用继承或委托时的一些示例:
假设您的类称为 B 并且派生/委托给类称为 A 然后If

  • 你想表达关系(is-a)然后你想使用继承。
  • 您希望能够将您的类传递给期望 A 的现有 API,那么您需要使用继承。
  • 您想增强 A,但 A 是最终的,不能进一步细分,那么您需要使用组合和委托。
  • 您想要方法的功能并且不想覆盖该方法,那么您应该进行委托。