当前位置:首页 > 文章列表 > 文章 > java教程 > 组合与继承

组合与继承

来源:dev.to 2024-09-30 20:48:45 0浏览 收藏

小伙伴们对文章编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《组合与继承》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

组合与继承

介绍

继承和组合是面向对象编程(oop)中的两个基本概念,但它们的用法不同,用途也不同。这篇文章的目的是回顾这些目的,以及选择它们时要记住的一些事情。

继承的概念

当我们考虑在设计中应用传统时,我们必须了解:

  • 定义:在继承中,一个类(称为派生类或子类)可以从另一个类(称为基类或超类)继承属性和行为。派生类可以扩展或修改基类的功能。
  • 关系:是一个“是a”(is-a)的关系。例如,如果您有一个类“vehicle”和另一个类“car”,则“car”类是“vehicle”的子类。
  • 优点:促进代码重用并允许轻松扩展功能。

构图概念

另一方面,如果我们考虑彼此组合对象:

  • 定义:在组合中,一个对象包含其他对象并将其部分功能委托给它们。类不使用继承,而是使用其他类的实例来实现其功能。
  • 关系:这是一个“有一个”关系(has-a)。例如,如果您有一个类“engine”和一个类“car”,则“car”类可以有一个类“engine”的对象。
  • 优点:更大的灵活性和类之间的耦合更少。一个类的更改不会直接影响另一个类。

为什么要对继承进行组合?

组合是否优于继承,或者反之亦然,这是软件设计中一个有争议的话题。两种方法都有其优点和缺点,选择取决于具体的项目背景和要求。在这里我将向您展示一个示例,其中组合比继承更可取。

让我们探索一个 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;
    }
}

这种方法可行,但如果您需要引入新的产品类型或为某些产品类型添加特定功能怎么办?

  • 构图重点:

我们可以使用组合来更灵活地处理不同类型的产品,而不是完全依赖继承:

// 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() 等方法拥有自己的特定逻辑。这种设计更加灵活,可以更轻松地引入新的产品类型或修改特定类型的逻辑,而不会影响继承层次结构。

什么时候应用继承?

虽然软件设计中继承和组合之间的选择取决于您正在解决的问题的上下文和特定要求。在某些情况下,您可能会认为继承比组合更合适:

  • is-a 关系:当类之间存在明确的“is-a”关系时,继承特别合适。如果类 b 是类 a 的更具体或更专业的版本,那么继承就有意义。例如,如果您有一个 vehicle 类和一个 car 类,那么“is-a”关系就很清楚,因为汽车是一种车辆类型。
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
    }
}

  • 功能扩展:如果您要扩展或专门化现有功能,继承可能会更自然。例如,如果您正在开发一个库并提供具有基本功能的基类,则您的库的用户可以从该基类派生来扩展该功能。

如果我们继承了不好的遗产,会发生什么?

如果我们继续评估继承的利弊,不良继承可能产生的问题之一是我们将违反接口隔离原则,该原则规定客户端不应被迫依赖于他们所使用的接口不使用。如果接口以包含与所有实现不相关的方法的方式扩展,则使用该接口的客户端可能被迫实现或依赖于他们不需要的方法,这可能导致设计不太干净且更困难。维护。

结论

总之,继承侧重于“是”关系,用于对类层次结构进行建模,而组合侧重于“有”关系,用于从其他更简单的对象构造复杂对象。两种方法都有其特定的用例,并根据软件设计中关系的结构和性质进行选择。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

版本声明
本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
django-components v 模板现在与 Vue 或 React 相当django-components v 模板现在与 Vue 或 React 相当
上一篇
django-components v 模板现在与 Vue 或 React 相当
React 中渲染 Props 的功能组件
下一篇
React 中渲染 Props 的功能组件
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • AI边界平台:智能对话、写作、画图,一站式解决方案
    边界AI平台
    探索AI边界平台,领先的智能AI对话、写作与画图生成工具。高效便捷,满足多样化需求。立即体验!
    419次使用
  • 讯飞AI大学堂免费AI认证证书:大模型工程师认证,提升您的职场竞争力
    免费AI认证证书
    科大讯飞AI大学堂推出免费大模型工程师认证,助力您掌握AI技能,提升职场竞争力。体系化学习,实战项目,权威认证,助您成为企业级大模型应用人才。
    426次使用
  • 茅茅虫AIGC检测:精准识别AI生成内容,保障学术诚信
    茅茅虫AIGC检测
    茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
    561次使用
  • 赛林匹克平台:科技赛事聚合,赋能AI、算力、量子计算创新
    赛林匹克平台(Challympics)
    探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
    665次使用
  • SEO  笔格AIPPT:AI智能PPT制作,免费生成,高效演示
    笔格AIPPT
    SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
    570次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码