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();
}
}
输出:
The Delegate
当你委托时,你只是在调用一些知道必须做什么的类。你并不关心它是如何做的,你所关心的是,你所调用的类知道需要做什么。
使用继承的相同代码
// 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,那么 如果
- 你想表达关系(is-a),那么你就想使用继承(Inheritance)。
- 你想把你的类传递给一个期待A的现有API,那么你需要使用继承。
- 你想增强A,但A是最终的,不能再被子类化,那么你需要使用组合和委托。
- 你想要一个方法的功能,但不想覆盖该方法,那么你应该使用委托。