深入abstract class和interface (2)

vba 修改下拉列表_Excel联想式下拉菜单制作教程II ?点击关注Excel表哥公众号上期我们分享了Excel联想式下拉菜单制作教程,可以简化大家在下拉菜单过长时的数据录入工作。文章末尾给大家提出了一个问题:为什么下拉列表数据源需要先排序?今天我们继续分享一个不用对数据源排序也能实现的下拉列表制作方法。先看最终的效果动图:今日分享难度指数:★★★★☆01创建辅助列在需要设置下拉列表的工作表中创建一列辅助列,如下图所示:在辅助列F3单元格输入下... 阅读详情
其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。

如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在本例中,主要是为了展示abstract class和interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略)下面将罗列出可能的解决方案,并从设计理念层面对这些不同的方案进行分析。

解决方案一:

简单的在Door的定义中增加一个alarm方法,如下:

abstract class Door { 
 abstract void open(); 
 abstract void close(); 
 abstract void alarm(); 
} 

  
或者 

interface Door { 
 void open(); 
 void close(); 
 void alarm(); 
}


那么具有报警功能的AlarmDoor的定义方式如下:

class AlarmDoor extends Door { 
 void open() { … } 
 void close() { … } 
 void alarm() { … } 
} 

  
或者 

class AlarmDoor implements Door { 
 void open() { … } 
 void close() { … } 
 void alarm() { … } 
}


这种方法违反了面向对象设计中的一个核心原则ISP(Interface Segregation Priciple),在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变,反之依然。

解决方案二:

既然open、close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有:这两个概念都使用abstract class方式定义;两个概念都使用interface方式定义;一个概念使用abstract class方式定义,另一个概念使用interface方式定义。

显然,由于Java语言不支持多重继承,所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的,但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。

如果两个概念都使用interface方式来定义,那么就反映出两个问题:

1、我们可能没有理解清楚问题领域,AlarmDoor在概念本质上到底是Door还是报警器?

2、如果我们对于问题领域的理解没有问题,比如:我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的,那么我们在实现时就没有能够正确的揭示我们的设计意图,因为在这两个概念的定义上(均使用interface方式定义)反映不出上述含义。

如果我们对于问题领域的理解是:AlarmDoor在概念本质上是Door,同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢?前面已经说过,abstract class在Java语言中表示一种继承关系,而继承关系在本质上是"is a"关系。所以对于Door这个概念,我们应该使用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定义。如下所示:

abstract class Door { 
 abstract void open(); 
 abstract void close(); 
} 
interface Alarm { 
 void alarm(); 
} 
class AlarmDoor extends Door implements Alarm { 
 void open() { … } 
 void close() { … } 
    void alarm() { … } 
}


这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系,interface表示的是"like a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有 Door的功能,那么上述的定义方式就要反过来了。

abstract class和interface是Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法,希望读者朋友能够细细体会。
【云迁移工具RDA】迁移常见问题 Agent无法正常启动,Linux系统提示“SMS.0201 Failed to start sms agent!”,Windows系统提示“SMS.0201 源端主机网络繁忙,无法连接api网关”。该问题通常是由于源端没有通公网,或者没有按照要求配置hosts,无法与iam或者sms通信导致。需要排查源端网络。1.登录源端服务器。2.检查源端是否能正常访问互联网,若无法访问,请处理后重新启动Agent。可参考弹性公网IP Ping不通检查源端的DNS,防火墙,安全组、本地网络等。 阅读详情

相关推荐

告别VMware Tools!用open-vm-tools在Ubuntu 22.04上搞定共享文件夹(附开机自动挂载)

本文详细介绍了在Ubuntu 22.04上使用open-vm-tools替代VMware Tools实现高效共享文件夹管理的方法。通过开源工具open-vm-tools,用户可避免传统方案的兼容性问题,享受自动适配内核、系统更新同步等优势。文章包含从安装配置到开机自动挂载的全流程指导,特别适合在VMware虚拟机中运行Ubuntu Desktop的开发者提升工作效率。

weixin_32520095的博客 585

用java实现抽象类门Door,能进行开门(openDoor)关门(closeDoor)操作,有防盗,防水,防火,防锈,防弹功能...

用java实现抽象类门Door,能进行开门(openDoor)关门(closeDoor)操作,有防盗,防水,防火,防锈,防弹功能 1.背景 前两天老师布置了这个作业,自己正好趁着这次机会,把已经学过的java知识:继承,重写,抽象,接口,上转型对象,异常类以及Class类等整合一下。 2.题目 做一个门类Door,该门能进行开门openDoor与关门closeDoo...

836811384 3200

深入RK3588内存管理:如何用dma_buf_alloc和mpp_buffer为RGA2分配4G以内内存(附kernel版本选择)

本文深入探讨了RK3588平台上RGA2核心的4G内存限制问题,详细解析了dma_buf_alloc和mpp_buffer两种内存分配方案的技术细节与适用场景。通过代码示例和性能对比,帮助开发者优化高分辨率视频处理流程,并提供了内核版本选择与常见错误排查指南。

weixin_29168153的博客 367

Abstract class VS Interface2

前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的(参考文献〔3〕中有关于"is a"关系的大篇幅深入的论述,有兴趣的读者可以参考)。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了int

zhangjs712的博客 392

GO与KEGG富集分析实战:从差异基因到功能注释

本文详细介绍了GO与KEGG富集分析的完整实战流程,从差异基因列表出发,通过基因ID转换、核心分析到结果可视化,系统阐述了如何将基因数据转化为生物学洞察。文章重点讲解了使用R语言clusterProfiler包进行GO和KEGG富集分析的具体步骤、参数设置及常见问题解决方案,并强调了结果解读与生物学故事构建的方法,帮助研究者深入理解差异基因的集体功能倾向。

weixin_29291863的博客 920

Altium Designer应用技巧1: 功能模块的复用方法

Altium Designer应用技巧1: 功能模块的复用方法      我们在使用Altium Designer进行电路图设计时,常会遇到功能模块的复用问题,例如我们经常需要将12V以DC-DC的方式转换成5V,这在很多线路板上都会应用到。现在我们普通的做法是,每个板子都重新绘制一遍,像这样DC-DC的电路,很浪费时间。那么如何采用提高工作效率呢?我们可以采取Altium Desi

snmplink的博客 1万+

java中的abstract class和interface(2)

考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示: 使用abstract class方式定义Door: abstract class Door { abstract void open(); abst

particle_1979的专栏 671

别再用LabelImg了!我手搓了一个C#“一站式”YOLO工具箱,标注训练推理全搞定

这个工具箱目前已经在两个小型产线项目中试用,反馈非常好。效率提升:原本需要 2 天完成的“数据准备 - 训练 - 验证”循环,现在缩短到了 2 小时。门槛降低:产线技术员经过 10 分钟培训,就能独立完成新产品的模型迭代。当然,它还有改进空间未来计划集成主动学习功能:自动筛选出置信度低的图片,推荐优先标注。支持多模型管理:方便在不同产品型号间快速切换。增加PLC 通信模块:直接在推理界面配置 IO 信号,实现真正的软硬联动。最后想说工具的本质是服务于人。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 442

模式乱写之2 : 接口VS抽象类 Interface VS Abstract Class

接口支持多继承; 抽象类支持缺省实现; is-a vs can-do ; 1publicinterfaceITh 2{ 3voidPose(); 4} 5 6publicinterfaceITb 7{ 8voidPost(); ...

weixin_30408165的博客 85

【示波器专题】示波器探头的原理深入——有源探头之单端有源探头

由于接地环路的苛刻要求,更高带宽的单端有源探头就算设计了也不实用。因此单端有源探头的带宽一般在6GHz以内,更高带宽的信号测量也只能使用差分有源探头(市面上有些型号的差分探头可同时兼顾单端测试)。......

一点硬件 2146

提示词驱动的智能合同生成与审核

第1章:核心概念与背景 1.1.1 问题背景 1.1.1.1 合同生成与审核的需求 合同作为商业和法律领域中的基本工具,其生成和审核过程至关重要。传统的合同生成往往依赖于法律专业人士的手工撰写,这不仅耗时耗力,而且容易出现错误。此外,合

AI天才研究院 1002

(2.1.15)抽象类abstract class和接口interface的区别

相同点: 都是支持抽象类定义的两种机制都不能被直接实例化其子类或实现类都必须实现了对应的抽象方法后才能实例化 ps:abstract只能修饰类和方法 不同点: 【关键词】接口interface使用关键词implements实现,抽象类abstract class使用关键词extends继承【方法】接口中只能有方法的定义,不能有实现,只能默认被public和abstrac

JAVA成长之路 741

数字IC/FPGA 秋招知识点不全面整理

数字IC/FPGA 秋招知识点不全面整理

w0shishabi的博客 7866

笔试题之interface和abstract class之间的区别

interface和abstract class之间有哪些区别?在C#中 1.首先abstract class 还是class,所以可以有数据成员,interface不可以 2.abstract class 可以有非abstract方法,而且可以有方法的实现,interface的方式不能有实现 3.abstract class 只能单继承,interface可以多继承。 4.interfa...

weixin_30575309的博客 105

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java 关键字

java中共有48个关键字,2个保留字,3个特殊直接量,共53个关键字 关键字 介绍 public 公有的 protected 受保护的 private 私有的 static 静态的 final 不可改变的,最终的 super 父类对象 this 当前对象 class 类 interface 接口 abstract 抽象 implements 实现 extends 继承 new 创建对象 import 导包 package 包路径

qq_39383582的博客 602

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

abstract class和interface的区别

abstract class和interface的区别 在Java语言中,abstract class和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class

Mr_liu的博客 279

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

.NET C#继承之自我解析:同签名方法派生自实体类、接口、抽象类后的生成结果

一句话:编程问题还是要靠自己动手来验证解决! 解决方案是控制台下创建的,这里把整个解决方案贴出来。 5个文件:Program.cs,Class1.cs,Class2.cs,InterFace1.cs,Abstract1.cs。 1. Program.cs using System; using System.Collections.Generic; using System.L

Faks8622的专栏 1322

理解abstract class和interface

abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很

段sir 的专栏 590

Abstract class and interface

在Java语言中,abstract class和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很

JackUltraman的博客 531

深入理解abstract class和interface

深入理解abstract class和interface 发表时间: 2005-05-23 11:49  abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行

飞行鱼的专栏 867

abstract class和interface有什么区别(二)

<br />1. 引言<br />在我之前的一篇post《抽象类和接口的谁是谁非》中,和同事管伟的讨论,得到很多朋友的关注,因为是不成体系的论道,所以给大家了解造成不便,同 时关于这个主题的系统性理论,我认为也有必要做以总结,因此才有了本篇的新鲜出炉。同时,我将把上贴中的问题顺便也在此做以交代。 <br />2. 概念引入<br />●什么是接口? <br />接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引 器、静

liangzhongqin的专栏 6443

abstract class和interface有什么区别?

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在...

我一直在努力 142

接口到底有什么用(JAVA)

一位Java大牛的回答        很多JAVA初级程序员对于接口存在的意义很疑惑。不知道接口到底是有什么作用,为什么要定义接口。       好像定义接口是提前做了个多余的工作。下面我给大家总结了4点关于JAVA中接口存在的意义:   1、重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java...

sinat_18474835的博客 2545

abstract class和interface有什么区别?

相同点: a.都不能被直接实例化,都可以通过继承实现其抽象方法。 不同点: b.接口支持多继承;抽象类不能实现多继承。 c.接口只能定义行为;抽象类既可以定义行为,还可能提供实现。 d.接口可以用于支持回调(CallBack);抽象类不能实现回调,因为继承不支持。 e.接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法; f.抽象类可以定义字段、属性、包含有实现的方法。 接口可以作用于值类型(Struct)和引用类型(Cl

didadidadidadid的博客 228
上一篇: 深入abstract class和interface (1)
下一篇: 【转载】java 面试中的一道编写一个截取字符串的函数
start_java
博客等级 码龄22年 5粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值