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

华为云CodeHub保姆级教程:从零开始,5分钟搞定本地代码上传(含常见报错解决) 本文提供华为云CodeHub的保姆级教程,从零开始5分钟完成本地代码上传,涵盖环境准备、仓库创建、远程连接及常见报错解决。特别适合新手开发者快速掌握Git命令与云端协作流程,确保代码安全高效上传。 阅读详情

继承与多态的危险性

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

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 多态性与一般性

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

Android 13 RK3588 编译烧写实录全程 本文详细记录了RK3588主板在Android 13系统下的各项功能测试与编译过程。主要内容包括:1)网络功能测试(以太网、WiFi、蓝牙连接);2)外设接口测试(耳机、麦克风、USB、TF卡);3)硬件功能验证(RTC时钟、ADC采样、MIPI摄像头);4)系统设置(手势导航、开发者选项);5)Android 13 SDK编译环境搭建与源码获取方法。通过图文并茂的方式展示了各功能的配置方法、操作步骤和测试结果,为开发者提供了全面的参考指南。 阅读详情

相关推荐

别再为3D抓取发愁了!Halcon手眼标定保姆级教程(Eye-to-Hand模式,含完整代码)

本文提供Halcon手眼标定的保姆级教程,详细讲解Eye-to-Hand模式下的3D抓取实现方法。从硬件配置、坐标系系统到标定流程和核心算法,涵盖完整代码和实战经验,帮助用户快速掌握工业自动化中的精准抓取技术。

weixin_42523711的博客 269

继承有什么安全缺陷?

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

凯凯的博客 493

C++ 程序稳定运行一段时间后异常中止?vc6 运行库的bug!!!

事件查看器提示:错误应用程序 xxxxxxx.exe,版本 0.0.0.0,错误模块 MSVCRTD.DLL,版本 6.0.9782.0,错误地址 0x00012b40。这是一个通信方面的软件,需要长期运行,在压力测试时,高负荷连续运行一定天数时必定崩溃,而且都是在msvcrtd.dll中崩溃。后来在dump文件中发现调用栈在是MSVCRTD.DLL模块,跟踪代码发现是在void * __cdecl _heap_alloc_dbg(        size_t nSize,        int nBloc

qingflying的专栏 2679

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

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

四金同学的博客 780

Python控制tek示波器(1)

如何使用Python来控制tek示波器

m0_47441496的博客 3379

碳化硅外延层厚度测量:红外干涉光谱与FFT技术详解

薄膜厚度测量是半导体制造中的关键工艺控制环节,其核心原理基于光的干涉现象。当光在薄膜上下界面反射并叠加时,会产生与厚度相关的干涉条纹。通过分析这些条纹,可以非接触、无损地获取薄膜的精确厚度信息。这项技术的核心价值在于实现了对关键工艺参数的在线、快速监控,对于提升器件性能与生产良率至关重要。在第三代半导体,尤其是碳化硅功率器件的制造中,外延层厚度直接决定了器件的击穿电压和导通电阻等核心性能。红外干涉光谱法因其对碳化硅材料在红外波段的良好透过性,成为该领域主流的厚度测量方案。通过快速傅里叶变换(FFT)对采集到

weixin_29032489的博客 308

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

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

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

YOLOv11 改进 - C2PSA | C2PSA融合TSSA(Token Statistics Self-Attention)令牌统计自注意力,优化遮挡目标感知

本文介绍了Token Statistics Self-Attention(TSSA)机制,并将其集成到YOLOv11中。传统自注意力计算复杂度高,TSSA进行了范式转变,基于token统计特征实现高效注意力交互。它通过“算法展开”推导得出,以“最大编码率降低”为目标,实现特征学习。TSSA包含动态分组和低秩投影优化两步创新,具备线性复杂度。我们将TSSA代码集成到YOLOv11的C2PSA模块中。实验表明,改进后的YOLOv11在目标检测任务中表现良好,验证了TSSA机制的有效性。

魔改工程师的博客 669

狱内罪犯危险性评估系统

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

JAVA计算机毕设的博客 218

【WRF-Chem教程第四期上】运行 WRF-Chem 模型

完整介绍运行 WRF-Chem 模型的详细步骤

WW、forever的博客 3108

【爬虫实战】Instagram博主图片爬取:模拟登录+滚动加载,轻松抓取高清美图

在当今社交媒体时代,Instagram作为全球最受欢迎的图片分享平台之一,汇聚了无数优质博主的海量精美图片。对于数据爱好者、营销分析师、AI训练数据收集者来说,如何高效、稳定地爬取Instagram博主的图片,成为了一项极具实用价值的技术挑战。然而,Instagram的反爬机制日益严格,传统的静态页面请求已经无法满足需求。本文将带你从零开始,使用2024-2025年最新技术栈,实现模拟登录、滚动加载、高清图片下载的全流程爬虫。✅ 全流程代码可直接运行✅ 模拟手机端请求绕过反爬。

2201_76125261的博客 596

Java基础-面向对象(五)

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

逍遥云恋 519

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

面向对象设计原则

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

chuifuhuo6864的博客 171

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

2301_80317450的博客 581

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

随风随想 3255

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、付费专栏及课程。

余额充值