下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、许多人都问过这个问题:为什么在某些地方你必须使用接口而不是抽象类,在其他地方你必须使用抽象类而不是接口?换句话说,当考虑Java类的泛化时,许多人会在接口和抽象类之间犹豫不决,甚至随便选择一个。事实上,接口和抽象类的选择不是任意的。为了理解接口和抽象类的选择原则,两个概念非常重要:对象的行为和对象的实现。如果一个实体可以以多种方式实现,那么在设计实体行为的描述时,我们应该达到这样一个目标:当使用一个实体时,我们不需要知道实体行为的实现细节。也就是说,对象的行为应该与对象的实现分开。既然Java的接口和抽象类可以定义不提供具体实现的方法,那么在将对象的行为与对象的实现分离时,我们应该使用接口还是
2、抽象类呢?通过抽象类建立行为模型当选择接口和抽象类时,我们必须遵守这样的原则,即行为模型应该总是通过接口而不是抽象类来定义。为了解释原因,我们试图通过抽象类建立一个行为模型,看看会发生什么。假设您想为销售部门设计一个软件,其中包含一个“汽车”实体。显然,引擎的所有方面都不能在引擎对象中详细描述,而只能描述当前软件的一些重要特性。至于发动机的哪些特性是重要的,有必要与用户(销售部门)沟通以确定。销售部的人要求每个发动机都有一个叫做马力的参数。对他们来说,这是唯一值得关注的参数。基于这一判断,发动机行为可以定义为以下行为。行为1:查询引擎的马力,引擎将返回一个代表马力的整数。虽然不清楚发动机是如何
3、获得马力的,但可以肯定的是,发动机必须支持这种行为,这是所有发动机中唯一值得关注的行为特征。这个行为特征可以由接口或抽象类定义。为了说明使用抽象类定义时可能出现的问题,通过使用抽象类建立了引擎行为模型,并使用Java方法描述了行为1。代码如下:公共抽象汽车抽象公共intGet马力();在电机抽象类的基础上,构造了各种具体实现,如A型引擎、B型引擎等。与系统的其他部分一起,最终获得软件版本1.0并交付使用。过一会儿,是时候设计软件版本2.0了。在评估2.0版软件需求的过程中,发现少数发动机由电池驱动,电池需要一定的充电时间。销售部的人想用电脑检查充电时间。根据这个需求定义一个新的行为,如图1所示
4、。行为2:查询电驱动引擎的充电时间,引擎将返回一个代表充电时间的整数。使用Java方法来描述这种行为,代码如下:公共抽象电池电动马达扩展马达抽象公共int GetMeterecharge();在销售部门的软件中,电驱动引擎也是以类的形式实现的,但是这些类是从电池驱动马达而不是马达派生出来的。将这些更改添加到2.0版软件后,销售部门感到满意。随着业务的不断发展,轻型发动机很快就出现了。销售部门要求光驱动发动机需要一定量的光能才能运行,光能以流明计量。这些信息对客户来说很重要,因为一些轻型发动机可能在雨天或多云天气下无法工作。销售部门要求软件增加对光驱引擎的支持,因此应该定义新的行为。行为3:查询
5、光驱动引擎正常运行所需的最小流明数,引擎返回一个整数。然后定义一个抽象类并将行为3转换成Java方法。代码如下:公共摘要SolarPoweredMotor扩展电机抽象公共int GetLumenToOperate();如图1所示,SolarPoweredMotor和BatteryPoweredMotor都是从电机抽象类派生出来的。在整个软件中,超过90%的代码以相同的方式对待所有的引擎。偶尔,有必要检查发动机是光驱动还是电驱动,这是通过实例来实现的。代码如下:SolarPoweredMotor的实例).BatteryPoweredMotor的实例).参数马力在任何类型的引擎中都非常重要,因此g
6、et马力()方法在所有派生的抽象类(SolarPoweredMotor和BatteryPoweredMotor)中都有效。现在销售部门有了一个新的引擎,它是一个双驱动引擎,既有电驱动又有光驱动。光驱和电驱动器的性能没有变化,但新引擎支持这两种性能。当考虑如何定义一种新型的光电驱动引擎时,接口和抽象类之间的区别开始显现。新的目标是在添加新引擎的前提下尽可能少地修改代码。因为与光驱引擎和电驱动引擎相关的代码已经过全面测试,所以没有已知的错误。为了增加光电驱动引擎,定义了一个新的SolarBatteryPowered抽象类。如果SolarBatteryPowered是从电机抽象类派生的,则Solar
7、BatteryPowered将不支持光驱动发动机和电驱动发动机的操作实例。也就是说,如果你问电光驱动引擎是由光驱动还是由电驱动,答案是:都不是。如果SolarBatteryPowered是从SolarPoweredMotor(或BatteryPoweredMotor)抽象类派生的,将会出现类似的问题,并且SolarBatteryPowered将不支持针对BatteryPoweredMotor(或SolarPoweredMotor)的操作实例。从行为上来说,电光驱动引擎必须同时从两个抽象类中派生出来,但是Java语言不允许多重继承。这个问题的根本原因是,使用抽象类不仅意味着定义特定的行为,还意味
8、着定义实现模式。也就是说,我们应该定义一个引擎如何获得行为的模型,而不仅仅是声明引擎具有某种行为。通过界面建立行为模型如果接口用于构建行为模型,它可以避免隐式指定实现模式。例如,前面的行为定义如下,而不是接口。行为1:公共接口电机()public intGet马力();行为2:公共接口电池电动马达扩展马达()public int GetMeterecharge();行为3:公共接口SolarPoweredMotor扩展电机抽象公共int GetLumenToOperate();现在,电光驱动引擎可以描述为:公共双动力马达实施太阳能动力马达,电池动力马达DualPoweredMotor只继承行为定义,而不是行为的实现模式,如图2所示。虽然使用接口,抽象类仍然可以使用,但是抽象类的功能是实现行为而不是定义行为。只要实现行为的类符合接口定义,即使它改变了父抽象类,也没有必要改变其他代码与之交互的方式。特别是对于常见的实现代码,抽象
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石家庄人民医学高等专科学校《领导科学》2025-2026学年期末试卷
- 沈阳音乐学院《工作研究与分析》2025-2026学年期末试卷
- 光伏砷化镓组件制造工操作能力强化考核试卷含答案
- 抽纱刺绣工岗前安全宣贯考核试卷含答案
- 康乐服务员创新思维强化考核试卷含答案
- 玻璃冷加工工安全宣传考核试卷含答案
- 麦芽制麦工岗前安全宣传考核试卷含答案
- 2026年网络安全基础知识及防范技巧
- 聚合反应工岗前安全操作考核试卷含答案
- 保伞工操作评估模拟考核试卷含答案
- 毕业设计(论文)-两辊式轧钢机设计
- 2026春小学苏少版(2024)二年级下册美术每课教案(第一、二单元)
- 采购部门纪律制度
- 2025年学校信息化工作三年发展规划方案
- 2026年社工考试《初级社会工作综合能力》真题及答案
- 行政单位财务管理培训内容
- 2026杭州市市级机关事业单位编外招聘148人笔试备考题库及答案解析
- 福建省莆田市2026届高中毕业班第二次质量调研测试试卷(莆田二检) 英语+答案
- 2026四川成都天府新区投资集团有限公司招聘产业投资岗等岗位47人考试参考题库及答案解析
- Songmont山下有松品牌手册
- 国家职业标准 6-28-01-12 风力发电运维值班员L (2025年版)
评论
0/150
提交评论