多态与面向接口编程多态对象数组与多态接口与多态面向接口编程为什么需要多态在教师类的基础上,开发一个类代表总部,负责对各教员进行评估,评估内容包括:1、教师的自我介绍2、教师的授课为什么需要多态publicclassHQ1{publicvoidjudge(JavaTeacher2t){t.introduction();t.giveLesson();}publicvoidjudge(DotNetTeacher2t){t.introduction();t.giveLesson();}publicstaticvoidmain(String[]args){HQ1hq=newHQ1();hq.judge(newAccpJavaTeacher2(“李明”,“北京大学“));hq.judge(newAccpDotNetTeacher2(“张明”,“天津大学“));}}第一种解决方案大家好!我是北京大学的李明.启动Eclipse知识点讲解总结提问大家好!我是天津大学的张明.启动VisualStudio2005知识点讲解总结提问控制台输出为什么需要多态现在,升级教师类,增加一种新类型:DBTeacher,该类型的教员专门负责教授数据库,要求如下:属性:姓名、所在学校方法:授课(启动SqlServer、实施理论课授课)、自我介绍同时,总部也负责对这类教师进行评估为什么需要多态如果在第一种解决方案的基础上去解决,我们需要如下两个步骤:建立DBTeacher类修改总部类,增加方法:judge(AccpDBTeachert)每增加一种新的教员类型,都要修改总部类,增加相应的judge(评估)方法,代码的可扩展性及可维护性极差能找到这个解决方案的弊端吗?为什么需要多态5-5第二种解决方案——使用多态publicclassHQ3{publicvoidjudge(AccpTeachert){t.introduction();t.giveLesson();}publicstaticvoidmain(String[]args){HQ3hq=newHQ3();hq.judge(newAccpJavaTeacher2(“李明”,“北京大学“));hq.judge(newAccpDotNetTeacher2(“张明”,“天津大学));hq.judge(newAccpDBTeacher(“李岚”,“北京大学“));}}可以接收子类类型根据实际创建的对象类型调用相应方法大家好!我是北京大学的李明.启动Eclipse知识点讲解总结提问大家好!我是天津大学的张明.启动VisualStudio2005知识点讲解总结提问大家好!我是北京大学的李岚.启动SqlServer知识点讲解总结提问控制台输出使用多态之后,当需要增加新的子类类型时,无需更改总部类,程序的可扩展性及可维护性增强什么是多态简单来说,多态是具有表现多种形态的能力的特征同一个实现接口,使用不同的实例而执行不同操作彩色打印机打印机黑白打印机打印效果:彩色打印效果:黑白打印打印如何实现多态1、子类重写父类的方法2、编写方法时,使用父类定义的方法3、运行时,根据实际创建的对象类型动态决定使用哪个方法小结请编码实现如下需求:乐器(Instrument)分为:钢琴(Piano)、小提琴(Violin)各种乐器的弹奏(play)方法各不相同。编写一个测试类InstrumentTest,要求:编写方法testPlay,对各种乐器进行弹奏测试。要依据乐器的不同,进行相应的弹奏。在main方法中进行测试对象数组与多态Demo接口与多态5-1为ACCP各中心开发这样一个小系统,包含类型:教员、中心、打印机,具体要求如下:教员、以及中心都具有方法:输出详细信息中心具有属性:打印机,能够通过中心的打印机打印教员或中心的详细信息系统要具备良好的可扩展性与可维护性打印教员中心教员详细信息中心详细信息detail方法(输出详细信息)为什么需要Java接口5-2以下这个解决方案中存在着什么问题?publicclassAccpTeacher1{//输出教员的详细信息publicstringdetail(){return本人是ACCP教员;}}publicclassAccpSchool1{privatePrinterprinter=newPrinter();//输出中心的详细信息publicstringdetail(){return这里是ACCP中心;}//使用打印机打印教员信息publicvoidprint(AccpTeacher1t){printer.print(t.detail());}//使用打印机打印中心信息publicvoidprint(AccpSchool1s){printer.print(s.detail());}}publicclassPrinter{publicvoidprint(stringcontent){Console.WriteLine(开始打印:);Console.WriteLine(content);}}每增加一种新类型,都需要增加相应的print(类型名称var)方法——程序的可扩展性及可维护性极差——这不符合系统的要求为什么需要Java接口5-3可以通过多态性解决这个问题吗?显然,本系统符合使用多态性的条件教员中心detail方法(负责输出详细信息)教员详细信息中心详细信息1221回顾多态的含义:实现同一个接口,使用不同的实例而执行不同操作为什么需要Java接口5-4在这个系统中,存在继承关系吗?教员、中心属于两种不同的类型,无法通过“is-a”找到一个合适的父类教员、中心都存在一个共同的方法特征:detail,它们对detail方法有各自不同的实现——这完全符合接口的定义定义一个接口,在其中定义detail方法,但没有具体实现实现这个接口,不同的类对detail方法有不同的具体实现IntroduceableAccpTeacher2(教员)AccpSchool2(中心)为什么需要Java接口5-5publicinterfaceIntroduceable{publicstringdetail();}publicclassAccpSchool2:Introduceable{privatePrinterprinter=newPrinter();//输出中心的详细信息publicStringdetail(){return这里是ACCP中心;}//使用中心打印机打印信息publicvoidprint(Introduceableintro){printer.print(intro.detail());}}publicclassAccpTeacher2:Introduceable{//输出教员的详细信息publicstringdetail(){return本人是ACCP教员;}}通过Java接口,我们同样可以享受到多态性的好处,大大提高了程序的可扩展性及可维护性使用print方法时,参数可以是任何Introduceable接口的实现类的对象,不必再为不同的类型建立不同的print方法了使用了接口之后,这个系统有了怎样的改进?小结1为刚才完成的系统增加一种新的类型:学员(AccpStudent),具体要求如下:学员具有detail方法,负责输出学员详细信息能够通过中心的打印机打印学员的详细信息系统要具备良好的可扩展性与可维护性编写测试类StudentTest进行测试,要求:通过中心的打印机打印学员的详细信息什么是面向接口编程开发系统时,主体构架使用接口,接口构成系统的骨架这样就可以通过更换接口的实现类来更换系统的实现publicclassAccpSchool2:Introduceable{privatePrinterprinter=newPrinter();publicStringdetail(){return这里是ACCP中心;}//使用中心打印机打印信息publicvoidprint(Introduceableintro){printer.print(intro.detail());}}IntroduceableAccpTeacher2(教员)AccpSchool2(中心)面向接口编程的示例4-1升级上述的ACCP系统,要求:打印机有多种类型,比如:黑白打印机、彩色打印机等中心可能配备其中任意一款打印机,负责打印教员、或者中心的详细信息系统要具备良好的可扩展性与可维护性print方法(打印)彩色打印机黑白打印机黑白内容中心/教员详细信息彩色内容面向接口编程的示例4-2采用面向接口编程的方式实现,以下是三个步骤中的第一步:抽象出接口1、分析:黑白、彩色打印机都存在一个共同的方法特征:print黑白、彩色打印机对print方法有各自不同的实现2、结论:抽象出Java接口PrinterFace,在其中定义方法print3、具体实现:publicinterfacePrinterFace{publicvoidprint(Stringcontent);}面向接口编程的示例4-3采用面向接口编程的方式实现,以下是三个步骤中的第二步:publicclassColorPrinter:PrinterFace{publicvoidprint(Stringcontent){Console.WriteLine(彩色打印:);Console.WriteLine(content);}}publicclassBlackPrinter:PrinterFace{publicvoidprint(Stringcontent){Console.WriteLine(黑白打印:);Console.WriteLine(content);}}实现接口1、分析:已经抽象出Java接口PrinterFace,并在其中定义了print方法黑白、彩色打印机对print方法有各自不同的实现2、结论:黑白、彩色打印机都实现PrinterFace接口,各自实现print方法3、具体实现:面向接口编程的示例4-4采用面向接口编程的方式实现,以下是三个步骤中的第三步:使用接口1、分析:主体构架使用接口,让接口构成系统的骨架2、结论:更换实现接口的类就可以更换系统的实现3、具体实现:publicclassAccpSchool3:Introduceable{privatePrinterFaceprinter;//打印机publicvoidsetPrinter(PrinterFacep){this.printer=p;}publicstringdetail(){return这里是ACCP中心;}publicvoidprint(Introduceableintro){printer.print(intro.detail());}}publicclassAccpTest{publicstaticvoidMain(string[]args){//创建中心实例AccpSchool3school=newAccpSchool3();//为该中心配备黑白打印机school.setPrinter(newBlackPrinter());school.print(school);//为该中心配备彩色打印机school.setPrinter(newColorPrinter());school.print(school);}}小结2阅读如下代码,然后请采用面向接口编程的思想,在空白处填写正确的代码publicinterfacePCI{voidstart();voidstop();}classSoundCard:PCI{publicvoidstart(){Console.WriteLine(Dudu...);}publicvoidstop(){Console.WriteLine(Soundstop!);}}classNetworkCard:PCI{publicvoidstart(){Console.WriteLine(S