在Java中用例子支持组合而不是继承
优先组合胜过继承是面向对象编程 (OOP) 中的一项原则。类应该通过它们的组合而不是从基类或父类继承来实现多态行为和代码重用。为了获得更高的设计灵活性,设计原则是组合优先于继承。
仅当子类“是”超类时才应使用继承。不要使用继承来获得代码重用。如果没有“是一个”关系,则使用组合进行代码重用。
在Java和 OOP 中支持组合而非继承的原因:
- Java不支持多重继承这一事实是在Java中偏爱组合而非继承的原因之一。由于您只能在Java中扩展一个类,但是如果您需要多个功能,例如将字符数据读取和写入文件,则需要 Reader 和 Writer 功能。将它们作为私有成员使您的工作变得简单,这称为组合。
- 组合提供了比继承更好的类测试能力。如果一个类由另一个类组成,为了测试,您可以轻松地构造一个表示组合类的 Mock 对象。这种特权不是由继承赋予的。
- 尽管 Composition 和 Inheritance 都允许您重用代码,但 Inheritance 的缺点之一是它破坏了封装。如果子类的功能依赖于超类的函数,它会突然变得脆弱。当超类的行为发生变化时,子类的功能可能会被破坏,而无需对其进行任何修改。
- 在永恒的经典设计模式中,四人组列出的几种面向对象设计模式:可重用面向对象软件的元素,支持组合而不是继承。策略设计模式,其中组合和委托用于在不接触上下文代码的情况下修改 Context 的行为,是一个典型的例子。而不是通过继承来获取,因为Context使用组合来承载策略,在运行时有一个新的策略实现很简单。
- 组合优于继承的另一个原因是灵活性。如果您使用 Composition,您就可以灵活地替换 Composed 类实现的更好和更新版本。一个例子是比较器类的使用,它提供了用于比较的特性。
继承:
继承是在面向对象编程中实现对象之间关系的设计策略。 extends 关键字用于在Java中实现继承。
class Person {
String title;
String name;
int age;
}
class Employee extends Person {
int salary;
String title;
}
在上面的例子中,员工“是”一个人或继承自人。所有的继承关系都是“is-a”关系。 Employee 还隐藏了 Person 的 title 属性,即 Employee。 title 将返回 Employee 的头衔,而不是 Person。
作品 :
在面向对象编程中,组合是执行对象之间关系的架构策略。 Java组合是使用来自其他对象的实例变量完成的。
class Person {
String title;
String name;
int age;
public Person(String title, String name, String age) {
this.title = title;
this.name = name;
this.age = age;
}
}
class Employee {
int salary;
private Person person;
public Employee(Person p, int salary) {
this.person = p;
this.salary = salary;
}
}
Person p = new Person ("Mr.", "Kapil", 25);
Employee kapil = new Employee (p, 100000);
组合通常是“有一个”或“使用一个”的关系。这里 Employee 类有一个 Person。它不从 Person 继承,而是将 Person 对象传递给它,这就是它“拥有”Person 的原因。
组合优于继承
现在说你想创建一个 Manager 类型,所以你最终得到了下面的语法,这在Java中是不允许的( Java中不允许有多个继承):
//不允许多重继承
class Manager extends Person, Employee {
}
现在我们必须使用以下语法支持组合而不是继承:
Class Manager {
public string title;
public Manager(Person p, Employee e)
{
this.title = e.title;
}
}