类的高级特征(对多态、抽象和接口的理解2学时)_第1页
类的高级特征(对多态、抽象和接口的理解2学时)_第2页
类的高级特征(对多态、抽象和接口的理解2学时)_第3页
类的高级特征(对多态、抽象和接口的理解2学时)_第4页
类的高级特征(对多态、抽象和接口的理解2学时)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主讲教师张智计算机学院软件工程系对多态、抽象和接口的理解编程:模拟计算机与移动存储设备的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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论