
继承和组合是面向对象编程(oop)中的两个基本概念,但它们的用法不同,用途也不同。这篇文章的目的是回顾这些目的,以及选择它们时要记住的一些事情。
当我们考虑在设计中应用传统时,我们必须了解:
另一方面,如果我们考虑彼此组合对象:
组合是否优于继承,或者反之亦然,这是软件设计中一个有争议的话题。两种方法都有其优点和缺点,选择取决于具体的项目背景和要求。在这里我将向您展示一个示例,其中组合比继承更可取。
让我们探索一个 java 示例,该示例说明了在某些情况下组合如何优于继承。假设我们正在开发一家在线商店的订单处理系统。
首先,让我们考虑一种使用继承来表示可以购买的不同类型产品的方法,例如书籍和电子产品:
// clase base para productos
class producto {
string nombre;
double precio;
producto(string nombre, double precio) {
this.nombre = nombre;
this.precio = precio;
}
void procesarpedido() {
system.out.println("procesando pedido para " + nombre);
}
}
// clase para productos electrónicos que hereda de producto
class productoelectronico extends producto {
string modelo;
productoelectronico(string nombre, double precio, string modelo) {
super(nombre, precio);
this.modelo = modelo;
}
}
// clase para libros que hereda de producto
class libro extends producto {
string autor;
libro(string nombre, double precio, string autor) {
super(nombre, precio);
this.autor = autor;
}
}
这种方法可行,但如果您需要引入新的产品类型或为某些产品类型添加特定功能怎么办?
Gyb2b V1.01免费版可终身使用,是一款功能强大的B2B电子商务应用软件。该软件不仅更新和修改了V1.0相关功能,更是采用了目前互联网上最流行的LAMP组合(Linux+Apache+Mysql+PHP)开发完成,模板技术实现了界面与代码的有效分离,用户可以快速地在此基础上编译模板;提供B2B电子商务应用最常见的求购、供应、商品、公司库、行业资讯、商圈、资信认证、在线交易、交易评分、留言、搜
0
我们可以使用组合来更灵活地处理不同类型的产品,而不是完全依赖继承:
// clase para productos
class producto {
string nombre;
double precio;
producto(string nombre, double precio) {
this.nombre = nombre;
this.precio = precio;
}
void procesarpedido() {
system.out.println("procesando pedido para " + nombre);
}
}
// clase para productos electrónicos que utiliza composición
class productoelectronico {
producto producto;
string modelo;
productoelectronico(string nombre, double precio, string modelo) {
this.producto = new producto(nombre, precio);
this.modelo = modelo;
}
// puedes agregar lógica específica para productos electrónicos si es necesario
void procesarpedidoespecifico() {
system.out.println("procesando pedido específico para " + producto.nombre);
}
}
// clase para libros que utiliza composición
class libro {
producto producto;
string autor;
libro(string nombre, double precio, string autor) {
this.producto = new producto(nombre, precio);
this.autor = autor;
}
// puedes agregar lógica específica para libros si es necesario
void procesarpedidoespecifico() {
system.out.println("procesando pedido específico para " + producto.nombre);
}
}
在这种方法中,每种产品类型都有一个 product 类的实例,允许共享处理订单的通用逻辑。此外,每种产品类型都可以使用 processspecificorder() 等方法拥有自己的特定逻辑。这种设计更加灵活,可以更轻松地引入新的产品类型或修改特定类型的逻辑,而不会影响继承层次结构。
虽然软件设计中继承和组合之间的选择取决于您正在解决的问题的上下文和特定要求。在某些情况下,您可能会认为继承比组合更合适:
class vehiculo {
// ...
}
class automovil extends vehiculo {
// ...
}
class animal {
void comer() {
// lógica común para comer
}
}
class perro extends animal {
void ladrar() {
// lógica específica para ladrar
}
}
class Figura {
void dibujar() {
// Lógica común para dibujar una figura
}
}
class Circulo extends Figura {
void dibujar() {
// Lógica específica para dibujar un círculo
}
}
class Cuadrado extends Figura {
void dibujar() {
// Lógica específica para dibujar un cuadrado
}
}
如果我们继续评估继承的利弊,不良继承可能产生的问题之一是我们将违反接口隔离原则,该原则规定客户端不应被迫依赖于他们所使用的接口不使用。如果接口以包含与所有实现不相关的方法的方式扩展,则使用该接口的客户端可能被迫实现或依赖于他们不需要的方法,这可能导致设计不太干净且更困难。维护。
总之,继承侧重于“是”关系,用于对类层次结构进行建模,而组合侧重于“有”关系,用于从其他更简单的对象构造复杂对象。两种方法都有其特定的用例,并根据软件设计中关系的结构和性质进行选择。
以上就是组合与继承的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号