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 是最终的,不能进一步细分,那么您需要使用组合和委托。
- 您想要方法的功能并且不想覆盖该方法,那么您应该进行委托。