面向对象设计之五 继承与多态的危险性

基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----上篇(第123点) 基于STM32F103C8T6的循迹避障小车完整制作过程 由于本人的一个小项目,要做一个基于STM32的循迹避障小车,前后花了约1周的时间,这个过程种也参考了很多大神分享的资料,学到很多的东西。但是资料都比较分散,有些东西也不好找,在这里就想把自己制作小车的一个整体过程记录分享一下,希望能够帮到你。 我自己也算是一个小白,之前有做过 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎... 阅读详情

继承与多态的危险性

继承与多态使面向对象的设计方法与传统的软件开发方式区别开来。然而滥用继承也会将一些设计方案带入无法实现的地步。

1 继承的滥用

本节的目标是审查不同形式的错误的继承,以避免在将用的工程项目中滥用继承。

1.1 组合与继承混用

混淆了is-a与has-a的关系,使用继承将整体的多个部分整合在一起。

例如一架飞机是由机身、机翼、引擎等各部分组合的,而错误的将飞机继承自机身、机翼、引擎。这样在理解上就变成了,飞机同时是一种机身、一种机翼、一种引擎,这种理解当然是错误的。

 

1.2 继承层次倒置

在对某些复杂的现实情况抽象模型时,混淆了一般和特殊,导致类型层次倒置。

例如在现实中,企业组织是雇员向经理负责,经理向董事会成员负责。如果以抽象时以这种组织层次关系来建立类的抽象层次,则会出现继承层次倒置,例如经理派生自董事,而员工派生自经理。

 

1.3 混淆类与其实例

观看下面的示例:

观察熊与熊猫的实例为单个动物,而濒危动物的实例则是所有特种,因此这样继承下来之后则熊猫的实例也是濒危动物的实例,熊猫盼盼代表了所有的濒危特种,从is-a的角度并不合适。正确的表示方法为下面的类图:

动物中包括了一个引用,指向一个特种实例的引用,熊猫和熊在初始化时将初始化各自合适的物种的实例,指向濒危或非濒危的实例。


1.4 误用

现在有一个立方体的类,其实现了计算体积的方法,现在有一个房间类(room),为了利用计算体积的方法,房间类继承了立方体。但立方体的其他方法在房间上应用则是非法的,例如立方体的旋转。同时从is-a的角度上来说,房间是一个立方体的实例,这与常理上也说不通,正确的说法是房间的空间形状是立方体的。表示这种说法的类图如下图所示:

这种使用另一类中代码的技术叫做消息转发(或者委托),这种基于消息转发的设计方法,可以用来替代继承,但它并不使我们获得所有继承而来的操作,而要求我们逐条消息的指定需求访问其它类别的操作或属性。


2 多态的危险性

多态的引入提高了面向对象设计的简洁性,它允许多个类使用相同的名字来定义一个操作,也允许一个变量访问多个类中的对象。因此多态性实际是让操作环境自动选择相应的操作来执行,而无需复杂的case语句。操作和变量均可能表现出性。


2.1 操作的多态性

操作op的多态区是定义了op操作的类的集合。如果类A及其继承类都实现了op,且这些类构成了整个继承层次图的一个分支的多态区,称其为一个多态锥,A为多态锥的顶点。继承层次实现的也可能是一个不完整多态锥,因为某些类中没有定义op操作。

 

2.2 变量的多态性

变量的多态性是指变量在不同时间可以指向不同类的对象。变量V的多态区是V指向的对象所属类的集合。

例如在Java中基类对象可以引用不同的派生类的对象,而在python这种动态类型中一个变量可以随时指向任何一个类型。

 

2.3 消息中的多态性

消息需要指明消息的对象obj及执行的操作op,可以用obj.op表示。如前两节所描述,操作和变量都具有多态区。如果设计的系统中,变量的多态区包含于操作的多态区中,则系统是安全的。反之,如果对象多态落在操作多态之外,则执行时就会出现问题。

 

2.4 多态性与一般性

一般性也称谓参数化类或模板,参数化类也可能由于多态区冲突而引起运行时错误。可以这么说,在一般性的多态区,任何实例化的类都需要支持一般化多态区中的操作,否则就会出现运行时错误。

机器人中的数值优化(十二)——带约束优化问题简介、LP线性规划 本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例 阅读详情

相关推荐

华科软院研究生第一学期的事项(奖学金、学业、考试等)

奖助 研究生补助 每月500,全年共6000元 每个月月底学院会打到银行卡里 碰上开学、过年会延后发放 17年10月底发了9、10两个月的钱 18年3月底发了2、3月的钱 学业奖学金 17届全日制每人都有 按照考研最后综合成绩排名 前16 10000 前80 8000 其他 4000 大概11月底发 注意:第一年如果有挂科的话,第二年就不能参加学业奖学金评...

sjdeak的博客 3706

继承有什么安全缺陷?

有时候, 为了解决一个问题, 我们需要一个解决办法。 可是, 这个办法本身还会带来更多的问题。 新问题的解决带来更新的问题, 就这样周而复始, 绵延不绝。 java.io.FilePermission类被定义为final类-------意味着该类不能被继承, 不能被扩展了. 我们学程序的都知道 这样的类不算合格但是 OpenJDK为什么放弃了可扩展性? 在Java的安全管理模式下, 一个用户通常...

凯凯的博客 493

接地设计的本质:按电流类型选择物理连接方式

接地是电子系统中实现电位参考、噪声抑制与安全保护的基础技术,其核心原理在于为不同性质的电流提供可控的低阻抗返回路径。从直流到GHz频段,电流的频率特性、能量等级和持续时间决定了接地的物理实现方式——工频安全电流依赖低电阻导体,高频噪声需低感平面或磁珠衰减,ESD脉冲要求受控泄放电阻,浪涌能量则必须通过独立短路径导入大地。这种‘目的决定方式’的设计逻辑,直接关联EMC合规性、信号完整性与系统可靠性。本文聚焦PCB级与设备级工程实践,详解安全地、功能地、浪涌地与静电地的判据差异及六种典型连接策略,帮助硬件工程师

weixin_36369848的博客 258

基于SpringBoot狱内罪犯危险性评估系统的设计与实现

Java编程语言Java作为计算机领域中极具影响力的编程语言,自诞生以来便以其独特的优势在众多技术方向上大放异彩。它基于类和对象的概念,通过封装、继承和多态等特性,为构建复杂的软件系统提供了坚实的基础,有力地支持了面向对象的软件开发方法,使代码的组织和复用更加高效。其丰富的API 涵盖了从基本数据结构到网络通信、图形用户界面、数据库连接等各个方面,极大地简化了开发过程,降低了开发成本。

四金同学的博客 780

手把手教你修改miniwiggler配置信息,解决UDE连接问题(附FT_PROG工具下载)

本文详细介绍了如何使用FT_PROG工具修改miniwiggler配置信息,解决UDE连接问题。通过分析FT2232芯片的EEPROM结构,提供从驱动安装到配置烧写的完整流程,帮助开发者实现无缝连接英飞凌TriBoard开发板。文章还包含常见错误解决方案和高级批量配置技巧。

weixin_30919429的博客 373

解决用VScode写中文注释,Vivado打开之后是乱码的方法

这样就解决了中文注释乱码的问题,此外如果使用notepad++写verilog代码的话直接在notepad++上面将编码格式改为ANSI格式即可,更加方便快捷,所以此方法仅针对习惯用VScode写Verilog的同学,如果有其他好办法的话欢迎评论区补充。首先,VScode中的中文默认编码格式是UTF-8,然后Vivado的编码格式是vivado 默认的应该是ANSI编码格式,刚开始我先按照网上说明的,将VScode中的编码格式改为GBK格式(点击右下角->点击通过编码保存)。

weixin_50573305的博客 5809

基于SpringBoot+Vue的狱内罪犯危险性评估系统的设计与实现

Java简介Java是一种面向对象的静态式编程语言。Java编程语言具有多线程和对象定向的特点。其特点是根据方案的属性将方案分为几个不同的模块,这些模块是封闭的和多样化的,在申请过程中具有很强的独立性。Java语言在计算机软件开发过程中的运用可以达到交互操作的目的,通过各种形式的交换,可以有效地处理所需的数据,从而确保计算机软件开发的可控性和可见性。开发java语言时,保留了网络接口,Java保留的缺省网络接口可以与web应用程序编程所依赖的类别库相匹配。

全网粉丝10W+、全栈领域优质创作者、掘金、阿里云等社区博客专家、专注于全栈领域和毕业项目实战 289

帆软js--获取控件和单元格

参数面板: 获取面板控件 ,name为控件名称:_g().parameterEl.getWidgetByName("name") 取值:_g().parameterEl.getWidgetByName("tt3").getValue()2323 赋值:_g().parameterEl.getWidgetByName("tt2").setValue("987") 调用对应的事件比...

江湖行骗老中医 7197

狱内罪犯危险性评估系统

信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。

JAVA计算机毕设的博客 218

【乐企-工具篇】生成发票左上角二维码

【代码】【乐企-业务篇】生成发票左上角二维码。

九七的博客 707

ATE Pin Electronics电路学习总结

PinElectronics(PE)是ATE测试机的核心模拟前端电路,负责ATE与芯片间的信号转换与交互。主要包含四大功能模块:Driver实现逻辑信号到模拟电平的转换(VIH/VIL可编程);Receiver对DUT输出进行采样比较(VOH/VOL判定);ActiveLoad施加可编程电流负载;PPMU进行精密电压/电流测量。PE的性能直接影响功能测试和直流参数测试的精度,需定期校准维护。关键参数包括:Driver电压精度(±5mV)、Receiver比较精度(±10-50mV)、PPMU测量精度(±1-

歌颂苦难的行为是无耻的; 465

Java基础-面向对象(五)

引用变量的两种类型: 编译时类型(模糊一点,一般是一个父类) 由声明时的类型决定。 运行时类型(运行时,具体是哪个子类就是哪个子类) 由实际对应的对象类型决定。 多态的存在要有3个必要条件: 要有继承,要有方法重写,父类引用指向子类对象 引用数据类型的类型转换 子类转换为父类:自动转换 上转型对象不能操作子类新增的成员变量和方法。 上转型对象可以操作子类继承或重写的成员变量和方法 如果子类重...

逍遥云恋 519

PyTorch深度学习实战(6)——神经网络性能优化技术

神经网络性能优化技术是指通过改进神经网络的结构、参数初始化、正则化和训练过程等方面来提高其性能和泛化能力的方法。优化技术的选择和调试需要根据具体问题进行,通过不断实验和调整,找到最适合网络的优化策略。本节首先训练了一个简单的全连接网络,然后在此基础上介绍了简单有效的神经网络性能提升技巧。

盼小辉丶的博客 1万+

面向对象设计原则

  与设计模式相关的是设计原则。设计原则更像是理论,而设计模式是这种理论的具体体现。   每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题解决方案的核心。设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信...

chuifuhuo6864的博客 171

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C#学习笔记1 c#核心语法与面向对象编程

这篇文章系统性地整理了C#核心语法与面向对象编程知识体系,主要内容包括: C#基础概念与数据类型:介绍.NET平台发展历程、值类型与引用类型区别、基础数据类型对比表(整数/浮点/字符等)、变量/常量定义规则和四种数据类型转换方式。 流程控制与算法:涵盖分支结构(if/switch)和循环结构(for/while),并附经典算法示例。 数组与内存管理:详解一维/二维/交错数组的内存模型,包含冒泡排序等数组算法。 方法机制:分析栈内存调用过程、参数传递方式(value/ref/out等)和递归应用。

2301_80317450的博客 581

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

面向对象——五大基本原则

在面向对象的程序设计中,存在着五个基本原则,即 SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)。当这些原则被应用在一起时,可以使得开发一个易于维护和扩展的系统成为可能。 一、单一功能原则(Single Responsibility Principle) 单一功能原则规定每一个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。所有它的服务都应该严密的和该功能平行(功...

随风随想 3255

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++继承机制详解:从原理到最佳实践

面向对象编程中的继承机制是实现代码复用的关键技术,通过建立基类与派生类之间的层次关系,形成is-a的语义关联。其核心原理包括访问控制、内存布局和虚函数表等底层实现,在C++中通过public/protected/private三种继承方式控制成员可见性。从工程实践角度看,合理使用继承能显著提升代码的可维护性和扩展性,特别是在框架设计和多态场景中。虚函数机制和RTTI支持运行时类型识别,而多重继承则需要特别注意钻石问题。现代C++通过override/final关键字和继承构造函数等特性优化了继承体系的设计体

weixin_33693070的博客 364

面向对象编程5

在Java中,一个类能继承另一个类,是单继承,如果发现一个类需要继承多个类的时候,就要考虑接口实现。 防盗门是一种门,它有一个锁。防盗门继承门,同时实现锁。防盗门是门类的一种(继承门类),具备一把防盗门专用锁,锁又归属于锁类,却又装在了防盗门上,成了防盗门的一部分。(防盗门的一部分继承了锁类)但我们不可以说防盗门是一种锁。 像这样,防盗门与防盗锁具备“has-a”的关系时考虑接口,防盗门与门类具备“is-a”的关系时考虑继承。 面向接口编程是面向对象编程体系中...

weixin_62537055的博客 339

Python面向对象详解

一,引子编程范式编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式, 对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式。 不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路, 大多数语言只支持一种编程范式,...

u014028063的博客 709

java编程原理

问题空间: 问题存在的地方,即业务内容。 解空间:解决方法,例如用计算机编程建模。 面向对象不会限于某种特定问题,我们将问题空间中的元素及其解空间中表示为“对象”。 面向对象思想的实质是:程序可以通过添加新的对象使自身适应于某个特定问题。 当阅读解决方案的代码的同时也是在阅读问题的表述。 OOP根据问题来描述问题,区别于面向过程。它的每一个对象像一台小计算机,拥有状态与操作,相当于现实世界中对象...

weixin_33921089的博客 631

面向对象5——接口

课前预习笔记 一、接口 1.为什么使用接口? 要求实现防盗门的功能 门有“开”和“关”的功能,锁有“上锁”和“开锁”的功能 将门和锁分别定义为抽象类 将门定义为抽象类,锁定义为接口防盗门继承门,实现锁的接口 防盗门可以继承门的同时又继承锁吗?如何解决这个问题呢? 2.什么是接口? (1)认识一下接口 public interface MyInterface { public void foo();//所有方法都是:public abstract //其他方法 }

m0_64119516的博客 315

TIJ 第一章 对象导论

第一章  对象导论 1.1  抽象过程 对象:具有状态(内部数据)、行为(方法)和标识(在内存中有唯一的地址将其与其他对象区分开)。 Smalltalk,被公认为历史上第二个面向对象的程序设计语言,和第一个真正的集成开发环境(IDE)。Smalltalk由艾伦·凯,DanIngalls,TedKaehler,AdeleGoldberg等于70年代初在Xerox PARC开发。 Smal

jiangaijinxingdaodi的专栏 847

面向对象深入和数组深入

目录抽象类为什么需要抽象类?如何定义抽象类?要点接口为什么需要接口?接口和抽象类的区别?接口相关规则如何定义接口?如何实现接口?内部类内部类的作用使用场合内部类的分类成员内部类静态内部类定义方式使用要点方法内部类匿名内部类要点 抽象类 为什么需要抽象类?如何定义抽象类? 是一种模板模式,抽象类为所有子类提供了一个通用模板,子类可以在这个模板基础上进行扩展。 通过抽象类,可以避免子类设计的随意性。通过抽象类,我们可以做到严格限制子类的设计,使子类之间更加通用。 abstract class Animal{

AndrewBest的博客 190

【大话设计模式读书笔记——五大原则】

单一功能原则 在面向对象编程领域中,单一功能原则(Single responsibility principle)规定每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。所有它的(这个类的)服务都应该严密的和该功能平行(功能平行,意味着没有依赖)。 这个术语由罗伯特·C·马丁(Robert Cecil Martin)在他的《敏捷软件开发,原则,模式和实践》一书中的一篇名为...

159

python支持多种编程范式吗_转并修改:Python编程范式(Programming Paradigm)

编程范式(Programming Paradigm)是某种编程语言典型的编程风格或者说是编程方式。随着编程方法学和软件工程研究的深入,特别是OO思想的普及,范式(Paradigm)以及编程范式等术语渐渐出现在人们面前。面向对象编程(OOP)常常被誉为是一种革命性的思想,正因为它不同于其他的各种编程范式。编程范式也许是学习任何一门编程语言时要理解的最重要的术语。托马斯.库恩提出“科学的革命”的范式论...

weixin_39743064的博客 153

应届生面试java开发时可能被问到的一些基础问题

只是个人记录 java面向对象三大特性——封装、继承和多态 封装:隐藏对象的属性和实现细节,仅对外提供公共的访问方式。类、方法也是封装的体现。当需要隐藏一些属性和方法时,将这些属性和方法封装起来,通过一个外部可以调用的特定接口或者说一个公共的方法进行调用。 继承:当多个方法存在相同的属性和方法时,就把这些相同的属性和方法提取到一个公共的方法中。子类重用父类代码。继承的特点:java只支持单继承。Java中类不支持多继承(即一个类只有一个父类)但是保留了这种多继承机制,可以多重继承。A继承B,B继承C,C

Tangqiu_的博客 1068
上一篇: 系统设计中业务规则与系统规则的应用
下一篇: word2007中鼠标不能定位问题
zzulp
博客等级 码龄19年 464粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值