复合优先于继承

继承是代码重用的有力武器,但是它并不是完成这项工作的最佳工具,不适当的使用继承会导致脆弱的软件,在

一个包内部使用继承是非常安全的,子类和超类的实现在同一个程序员的控制之下,对于专门为了继承而设计并且

具有很好文档说明的类,使用继承也很安全。然而,对普通的具体类进行跨越包边界的继承则是非常危险的。
1,与方法调用不同,继承打破了封装性。
一个子类依赖于超类中特定功能的实现细节,超类的实现有可能随着发行版本的不同而变化,如果真的发生了

变化,子类可能被打破。造成子类脆弱的另一个原因是,它们的超类在后续版本中可以获得新的方法,而这个新的

方法的名字有可能与子类的方法有共同的签名,这样就会产生覆盖或重载。
2,只有当子类真正是超类的"子类型"的时候,继承才是合适的。换句话说,对于两个类A和B,只有当两者之间

确实存在"is-a"关系的时候,类B才应该扩展类A。如果你打算让类B扩展类A,那么你应该问自己:"每一个B确实也

是A么?"如果你不能确定这个问题的答案是yes,那么B就不应该扩展A。
总之,继承机制的功能非常强大,但是它存在许多问题,因为它违背了封装原则,只有当子类和超类之间确实存

在子类型关系时,使用继承才是合适的。即便如此,如果子类和超类在不同的包中,并且超类不是为了扩展而设计

的,那么继承将会导致脆弱性,为了避免这种脆弱性,可以用复合和转发机制来代替继承,尤其是当存在一个适当

的接口来实现一个包装类的时候。
10、网络安全工具:Bettercap 与 Web 应用测试工具全解析 本文详细解析了网络安全工具Bettercap及其在中间人攻击和无线攻击中的应用,同时介绍了多种Web应用测试工具,如Amass、Cadaver、Dirb等,并探讨了工具的使用场景、流程、注意事项以及未来发展趋势,为网络安全测试提供了全面的指导。 阅读详情

相关推荐

Error: dependent ‘..\..\..\..\Qt\5.15.2\msvc2019\include\QtWidgets\QMainWindow‘ does not exist.

核心问题:修改 Build 目录为源码子目录后,MSVC 编译报错,本质是变量设置异常,导致 qmake 生成多余回溯路径;临时解决:在 .pro 文件添加;最优解决:将上述配置写入 Qt 的 msvc 对应 qmake.conf 全局文件,一劳永逸;禁止 qmake 计算路径时向上回溯,避免生成异常路径。

mumufan05的专栏 878

复合优先于继承。

在包的内部使用继承是非常安全的。在那里,子类和超类的实现都处在同一个程序员的控制之下。对于专门为了继承而设计、并且具有很好地文档说明的类来说,使用继承也是非常安全的。 与方法调用不同的是,继承打破了封装性。换句话说,子类依赖于其超类中特定功能的实现细节。超类的实现有可能会随着发行版本的不同而有所变化,如果真的发生了变化,子类可能会遭到破坏,即使他的代码完全没有改变。因此,子类必须要跟着其超类的更...

孤芳不自赏 731

光度立体三维重建——光源标定

光源标定的目的是为了确定光源方向或强度,一般利用物体表面的明暗信息、阴影信息或者反射特性三类信息中的其中一种即可,也可以将三种信息结合。采用不同标定物,是利用不同标定物的反射特性获取更加精确的光源信息。

wfengzi5的博客 1561

C# 多态-继承多态

什么是多态? 个人理解为:在程序语言继承关系中,子类能替代父类,表现出不同的行为。 换句话说:在继承关系中,一个类被实例化被其子类替代,子类中有父类的虚方法重写,或者有父类同名方法(new),调用相同方法时候, 将表现出子类或者父类中不同行为 老板,上代码 static void Main(string[] args) { Console.WriteLine("Hello World!"); ...

263

【AI Infra】Perfetto性能分析工具指南

Perfetto是一款开源性能分析工具,提供系统级和应用级的活动数据追踪功能。其界面分为四个区域:左侧操作区(包含Trace查看、SQL查询、预置分析等功能)、上方信息区、中间图形化展示区以及下方详细信息区。工具支持快捷键操作(w/s缩放、a/d移动、m标记等),并能高效处理大体积Trace文件。通过Timeline分析可发现性能瓶颈,如案例中update_actor耗时过高的问题,最终定位到CPU offloading导致的MemcpyH2D操作耗时过长,提出了优化方案。Perfetto相比Systrac

baiweizeng的博客 1508

FPGA新手必看:用USB转TTL实现串口通信的完整流程(附CH340G电路详解)

本文为FPGA新手提供了通过USB转TTL模块实现串口通信的完整实战指南。详细解析了CH340G电路设计要点、硬件连接方法,并分享了经过验证的Verilog代码框架,帮助读者快速掌握FPGA与PC通信的核心技术,解决电平匹配与波特率设置等常见问题。

cake8的博客 1049

简单理解复合优先于继承

在看effective java时,有一条[复合优先于继承]的代码一直理解不了,不知道复合是什么意思,复合和继承到底有什么区别.网上代码都是 HashSet 的那个例子,不是很好理解 所以重新写了一段代码,方便理解. 首先看一个简单的例子 父类 Animal 代码 package com.example.springboot01.instance; public class Animal { protected void print() { print2(); } .

sinat_34067387的博客 345

[Adaptive Autosar]深入理解--Time Synchronization

目录 1.TS典型应用场景 2.CP和AP时间同步对比 3.时间同步基础知识 4.TBR部分参数说明 5. TS功能说明 5.1 基本说明 5.2 时间纠正计算说明 5.3 时间验证 Time Synchronization 时间同步,后面简称TS 1.TS典型应用场景 时间同步,典型应用就是在自动驾驶领域,自动驾驶领域涉及到各个传感器的数据采集,如IMU采集当前车身姿态和运动信息,毫米波雷达-超声波雷达-环视摄像头-前视摄像头...等等传感器捕获的数据,在算法中需要精确知道每个数.

AgingMoon的博客 3997

Effective Java笔记:复合优先于继承

强耦合是指子类和父类直接绑定在了一起,当父类的内部实现发生变化时,子类可能会无意中受到影响。例如,父类新增一个字段或修改一个方法,可能导致子类的行为和逻辑不再正确。继承是通过“Is-A”关系(从逻辑上表示子类是父类的一种子类型)来复用父类的代码。的值,改动父类 API 的隐含语义,可能引发意外的使用错误。继承行为是静态的,即在编译时确定了父子关系(依赖于静态类型),无法在运行时动态扩展功能。继承使用**“Is-A”**语义:一个对象可以被看作是它父类的一种类型。在继承关系中,子类可以直接访问父类的。

eclipseC的博客 1228

学Simulink——四开关 Buck‑Boost(FSBB)变换器的无缝模式切换仿真

本文详细介绍了使用Simulink实现四开关Buck-Boost(FSBB)变换器无缝模式切换的仿真方法。FSBB变换器因其输入输出同极性、单电感和双向能量流特性,广泛应用于光伏储能、USB-PD和车载电源等场景。文章重点解决了模式切换中的直通风险和占空比跳变问题,通过统一电压PI控制、Stateflow模式仲裁和200ns死区设计,实现了Buck(26V→24V)、Pass-Through(24V±1V)和Boost(22V)三种工作模式的无缝过渡。仿真结果显示输出电压稳定在12V±0.15V,切换过程无

amy_mhd的博客 66

【嘉立创EDA】PCB 多层板如何交换内层,4层板交换板层

本文使用嘉立创EDA,描述如何在PCB设计时,如何交换各个板层,特别是4层板需要交换内层时,应该如何操作,以供有需要的读者参考。

l64481000的博客 2014

《Effective Java》解读第18条:复合优先于继承

本文探讨了面向对象设计中复合优先于继承的原则。继承在跨包使用时存在风险,会破坏封装性(子类依赖父类实现细节)、可能破坏子类(父类更新导致冲突)、且并非所有情况都符合"is-a"关系。复合通过在新类中持有现有类的实例并转发方法调用,提供了更安全的复用方式。虽然复合存在"丢失身份"引用和轻微性能开销等缺点,但在大多数情况下仍是更好的选择。只有当子类真正是父类的子类型且愿意继承父类所有API缺陷时,才应考虑使用继承。

Cosmoshhhyyy的博客 632

Python爬虫教程:抓取电商网站评论(以淘宝和京东为例)

通过本文的介绍,我们学会了如何使用Python编写爬虫,抓取淘宝和京东等电商平台的商品评论数据。我们介绍了如何使用电商平台提供的开放API以及如何通过模拟浏览器来抓取动态加载的数据。此外,我们还讨论了如何应对反爬虫技术,如何存储抓取的数据等。爬取电商平台的数据是一个强大的工具,能够为市场分析、消费者行为研究、产品优化等领域提供有力的支持。然而,在使用爬虫技术时,我们必须遵循法律法规,尊重平台的隐私政策,避免滥用数据。

2201_76125261的博客 1738

Effective Java 类和接口 第16条:复合优先于继承

Effective Java 类和接口 第16条:复合优先于继承 继承(inheritance)是实现代码重用的有力手段,但它并非永远是完成这项任务的最佳工作。使用不当会导致软件变得很脆弱。在包的内部使用继承是非常安全的,在那里,子类和超类的实现都处于同一个程序员的控制下。对于专门为了继承而设计的并且具有很好的文档说明的类来说,使用继承也是非常安全的。然而,对于普通的具体类进行跨超包边界的继承则...

yancyang的博客 2万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

第18 条:复合优先于继承

复合优先于继承 核心: 对于专门为了继承而设计并且具有很好的文档说明的类来说,使用继承是非常安全的。然而,对普通的具体类进行跨越包边界的继承,则是非常危险的。 论证 与方法不同的是,继承打破了封装性 咋的理解了?看如下的例子 public class A { //方法功能是说话 public void say() { //一堆说话的实现细节 } //...

weixin_44130081的博客 364

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Chapter-4-Item-18-优先选择复合而不是继承

包装器类的缺点很少。此外,你的方法是否能够完成新的超类方法的约定是值得怀疑的,因为在你编写子类方法时,该约定还没有被写入。它相当于重新实现超类方法,这可能会导致「自用」,也可能不会,这是困难的、耗时的、容易出错的,并且可能会降低性能。为了优化程序的性能,我们需要查询 HashSet,以确定自创建以来添加了多少元素(不要与当前的大小混淆,当元素被删除时,当前的大小会递减)。如果答案是否定的,通常情况下,B 应该包含 A 的私有实例并暴露不同的 API:A 不是 B 的基本组成部分,而仅仅是其实现的一个细节。

学IT的细胞膜的博客 1072

第16条:复合优先于继承

术语:         继承(inhe)

u014723123的专栏 1949

Effective Java 复合优先于继承

继承是实现代码重用的有力手段,但是使用不当会导致软件变得脆弱。在包的内部使用继承是非常安全的,子类和超类的实现都处在同一个程序员的控制之下。对于专门为了继承而设计、并且具有很好的文档说明的类来说,使用继承也是非常安全的。然而们对于进行跨越包边界的继承,则要非常小心。“继承”在这里特指一个类扩展另一个类。 public class InstrumentedHashSet<E> extends HashSet<E> { private int addCount =.

菜园子丶For丨丶Tomorrow的博客 181

为什么讲复合优先于继承

封装,继承,多态是面向对象类语言的三个核心特性,但是我们经常看到教材或者各种书上会讲复合优先于继承,为什么呢? 首先不是说继承不如复合,复合更像是修饰者模式,基类和包装器类的关系,而继承就是父类和子类的关系 下面说的都是基于子类扩展父类(实现继承),而不是接口继承(一个类实现一个接口,或者一个接口扩展另一个一个接口) 在实际开发中继承的缺点: 与方法调用不同,继承打破了封装性:子类依赖于其超类中的特定功能的实现细节, 如果需要覆盖超类的方法,就必须要知道超类原来的方法的内部逻辑,否则会照成意想不到的事.

胖墩的IT博客 717

类和接口——复合优先于继承

理由如下:当我们要扩展一个类时,特别是一个别人写好的类,一个类库的类,我们往往关心的仅仅是单个api的功能,而不关心他的实现,但是存在的一个问题就是,同一个类的各个方法直接可能存在联系,可能一个方法的实现依赖于另一个方法,这就意味着,当我们调用一个我们想要操作的方法时,“继承”会隐式的调用另一个方法,这就可能存在问题。因为,在hashSet的addAll()实现中,是循环调用add()方法的,所以导致3*2。需求:新建一个集合类,维护一个addCount变量,记录,一共添加了多少次新值。

GSON的博客 271

java 复合_Java复合优先于继承

复合优于继承继承打破了封装性(子类依赖父类中特定功能的实现细节)合理的使用继承的情况:在包内使用父类专门为继承为设计,并且有很好的文档说明,存在is-a关系只有当子类真正是父类的子类型时,才适合用继承。对于两个类A和B,只有两者之间存在"is-a"关系,类B才能拓展类A。继承机制会把父类API中的所有缺陷传播到子类中,而复合允许设计新的API来隐藏这些缺陷。复合(composition):不扩展现...

weixin_36122351的博客 401

《Effective Java》阅读笔记16 复合优先于继承

《Effective Java》阅读笔记16 复合优先于继承 https://blog.youkuaiyun.com/qq_35635356/article/details/7965495

weixin_41563161的博客 360
上一篇: 常用linux命令
下一篇: javascript中的自执行匿名函数
disablebb
博客等级 码龄18年 5粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值