版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
主讲教师张智计算机学院软件工程系对多态、抽象和接口的理解编程:模拟计算机与移动存储设备的Read和Write操作。移动设备:
U盘类和移动硬盘类,含有两个方法Read和Write。计算机类:
能调用移动设备读写操作。扩展性要求:
由于可能会有新的移动存储设备(如MP3播放器),所以计算机类必须有扩展性。
新设备可能有新的方法,如MP3Player新加一个PlayMusic方法。4种方案方案1:简单直白方案2:抽象类方案3:接口方案4:多接口方案1:简单直白分别定义U盘FlashDisk类和移动硬盘MobileHardDisk类实现各自的Read和Write方法Computer类中包含上述移动设备类列表最后再测试扩展:新加MP3Player类FlashDisk类classFlashDisk{
publicvoidRead(){ System.out.println("ReadingfromFlashDisk……"); System.out.println("Readfinished!"); }
publicvoidWrite(){ System.out.println("WritingtoFlashDisk……"); System.out.println("Writefinished!"); }}MobileHardDisk类classMobileHardDisk{
publicvoidRead(){ System.out.println("ReadingfromMobileHardDisk……"); System.out.println("Readfinished!"); }
publicvoidWrite(){ System.out.println("WritingtoMobileHardDisk……"); System.out.println("Writefinished!"); } }Computer类classComputer{
FlashDiskfd; MobileHardDiskmhd;
publicComputer(){ } publicComputer(FlashDiskfd){ this.fd=fd; } publicComputer(MobileHardDiskmhd){ this.mhd=mhd; } }假设构造函数是设备驱动移动设备列表Computer类需要实例化这些移动设备测试publicclasstest{ publicstaticvoidmain(String[]args){ FlashDiskfd=newFlashDisk();
Computercmp1=newComputer(fd);
cmp1.fd.Write();MobileHardDiskmhd=newMobileHardDisk();
Computercmp2=newComputer(mhd); cmp2.mhd.Write();
}}此时考虑以后的扩展性,如:MP3Playermp3=newMP3Player();Computercmp3=newComputer(mp3);cmp3.mp3.PlayMusic();Computer对象调用不同设备实现操作新设备MP3Player类classMP3Player{
publicvoidRead(){ System.out.println("ReadingfromMP3Player……"); System.out.println("Readfinished!"); }
publicvoidWrite(){ System.out.println("WritingtoMP3Player……"); System.out.println("Writefinished!"); }
publicvoidPlayMusic(){//添加一个新方法 System.out.println("Musicisplaying……"); } }思考:此时Computer会怎样?此时修改Computer类classComputer{ FlashDiskfd; MobileHardDiskmhd;
MP3Playermp3;//新加设备
…
publicComputer(MP3Playermp3){//新加设备驱动
this.mp3=mp3; } }修改Computer类以兼容各种移动设备导致扩展性很差这就如在一个真实的计算机上,当有了一种新的移动存储设备后,就要将计算机大卸八块,然后增加一个新的插口,再编写一套针对此新设备的驱动程序。这种设计显然不可取。【返回】方案2:抽象类抽象类可实现多态性。定义一个抽象类MobileStorage(含Read和Write抽象方法)移动设备类(U盘FlashDisk、移动硬盘MobileHardDisk)继承extends抽象类,类中的代码不变。Computer类使用抽象类来替换移动设备列表,利用多态性而不必将移动存储类硬编码在Computer中。新建抽象类:MobileStorageabstractclassMobileStorage{ publicabstractvoidRead(); publicabstractvoidWrite();}FlashDisk、MobileHardDisk类添加继承:classFlashDiskextendsMobileStorage{
//类中的代码不变}…改造Computer类classComputer{
MobileStoragems;
publicComputer(){
}
publicComputer(MobileStoragems){
this.ms=ms; } }无需为每个设备写驱动这样代码得到简化只需使用抽象对象抽象类运行时动态绑定具体子类测试publicclasstest{ publicstaticvoidmain(String[]args){ FlashDiskfd=newFlashDisk(); Computercmp1=newComputer(fd); cmp1.ms.Write();MobileHardDiskmhd=newMobileHardDisk(); Computercmp2=newComputer(mhd); cmp2.ms.Write();
}}抽象类实现多态性新设备MP3Player类classMP3PlayerextendsMobileStorage{
publicvoidRead(){ System.out.println("ReadingfromMP3Player……"); System.out.println("Readfinished!"); } publicvoidWrite(){ System.out.println("WritingtoMP3Player……"); System.out.println("Writefinished!"); }
publicvoidPlayMusic(){//添加一个新方法 System.out.println("Musicisplaying……"); }
}思考:此时Computer又会怎样?继承抽象类类中代码保持不变(--不再变化)测试扩展性--新设备publicclasstest{ publicstaticvoidmain(String[]args){ … MP3Playermp3=newMP3Player(); Computercmp2=newComputer(mp3);
((MP3Player)cmp2.ms).PlayMusic();
}}父对象要访问子对象成员时必须先强制转化为子对象【返回】方案3:接口用接口实现多态。定义一个接口IMobileStorage(含Read和Write方法声明)移动设备类实现implements接口,类中的代码不变。Computer类使用接口作为设备列表,利用多态性实现动态替换移动设备。新建接口IMobileStorageinterfaceIMobileStorage{ publicvoidRead(); publicvoidWrite();}FlashDisk、MobileHardDisk、MP3Player类均要实现接口:classFlashDiskimplementsIMobileStorage{//类中的代码不变}…简单修改一下Computer类classComputer{
IMobileStorageims;
publicComputer(){
}
publicComputer(IMobileStorageims){
this.ims=ims; } }将抽象对象换成接口类型接口运行时动态绑定具体类测试publicclasstest{ publicstaticvoidmain(String[]args){ FlashDiskfd=newFlashDisk(); Computercmp1=newComputer(fd); cmp1.ims.Write();
MP3Playermp3=newMP3Player(); Computercmp2=newComputer(mp3); ((MP3Player)cmp2.ims).PlayMusic(); }}接口实现多态性何时用抽象类or接口看动机。如果主要是为了实现多态性,而不是为了代码重用,就用接口。【返回】方案4:多接口例如新设备--只读光盘,它只实现读方法而没有写方法,因此须采用多接口方案。如果我们知道以后出现的东西都是能读又能写的,那这多接口接口设计就没有必要了。总之:防止设计不足,也要防止设计过度。方案4:多接口定义2个接口IReadable和IWritable,两个接口分别只包含Read和Write。定义接口IMobileStorage
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国市政工程行业智能化管理与服务升级评估规划报告
- 安徽地理考试题目和答案解析
- 铁道工程测试题集及对应答案
- 2026中国文化版权交易运营行业现状供需分析及投资趋势发展方向报告
- 自贸区川南临港片区(泸州综合保税区)产业发展服务专员公开招聘模拟试卷及答案详解【基础+提升】
- 莲花县公办幼儿园合同制教师招聘【20人】考前冲刺密卷A4版附答案详解
- 达州市2026年公开考试招聘足球教练员的(10人)笔试题库【黄金题型】附答案详解
- 达州高新区2026年公开招聘社会工作服务岗位的(3人)笔试题库(网校专用)附答案详解
- 邻水县2026年考核招聘艺术专业技术人员的考前冲刺密卷附答案详解(完整版)
- 鄱阳县2026年城区义务教育学校选调公办教师【130人】考前冲刺试卷一套附答案详解
- 民用建筑方案设计工作量比例
- 2025数据基础设施参考架构
- 《内蒙古低空经济发展白皮书》
- 审计合同补充协议范本
- 危险性较大的分部分项工程专项施工方案严重缺陷清单(试行)
- 超导材料制备与特性-深度研究
- 胎盘、死婴、死胎处理管理制度及处置流程
- 医疗器械经营质量管理规范培训2024
- 食品加工安全生产管理制度
- 2024年江西省中考英语试卷试题真题及答案详解(精校打印)
- 电工管理制度电工管理制度办法
评论
0/150
提交评论