资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,继承,、,接口和多态,南华大学计算机学院,软件工程系,蒋良卫,继承、接口和多态南华大学计算机学院,1,本讲安排,理解继承,理解接口,理解多态,继承多态,接口多态,本讲安排理解继承,2,什么是继承,继承是对现实世界中“分类”概念的模拟,IS_A,狮子拥有动物的一切基本特征,,但同时又具有自己的个性,这就是“继承”关系的重要性质,父类与子类之间的基本特性,是一种(,IS-A,)关系,子类是父类的特例,扩充(,extends,)关系,子类拥有父类所没有的,功能,什么是继承继承是对现实世界中“分类”概念的模拟IS_A狮子拥,3,C#,中继承,子类“汇集”了父类中声明为,public,和,protected,的成员,父类,(parent class),基,类,(base class),子,类,(child class),C#中继承子类“汇集”了父类中声明为public和prote,4,成员访问权限,上一讲介绍过,public,和,private,,简单回忆,protected,:保护级别的成员,子类可以访问,其他类无法访问,代码示例演示,子,类中的代码可以直接访问父类保护级别的成员,但是外界不能通过对象变量来直接访问保护级别的类成员,成员访问权限上一讲介绍过public和private,简单回,5,继承小结,父类代表比较抽象的概念,而子类代表具体概念或事物,继承是表达“,子类,IS_A,父类,”关系,父,类可以引用子类对象,当子类与父类方法的签名相同时,存在两种情况,即,隐藏,和,重写,实际开发中,子类重写父类的方法应用较多,继承小结父类代表比较抽象的概念,而子类代表具体概念或事物,6,接口的引入,先看生活中的例子:,鸭子是一种鸟,会游泳,同时也是一种食物,C#,不支持多继承,“会游泳”这个方法应该放在哪个类中呢?只有部分鸟类会游泳,接口的引入先看生活中的例子:鸭子是一种鸟,会游泳,同时也是一,7,接口的定义和使用,C#,使用关键字,interface,定义接口,接口可以看成是一种“,纯粹,”的抽象类,它的所有方法都是,抽象,方法,接口的定义和使用C#使用关键字interface定义接口,8,解决多继承问题,使用“抽象基类”,+,“接口”为鸭子建立模型,一,个类可以实现多个接口,但只能有一个父类,解决多继承问题使用“抽象基类”+“接口”为鸭子建立模型,9,两种实现接口的方法,隐式接口实现与显式接口实现,显式实现的接口,只能通过接口变量调用其,方法,而不能通过对象变量调用,代码演示,两种实现接口的方法隐式接口实现与显式接口实现,10,接口的小结,与抽象基类相比,接口不含任何的实现代码,接口实际上可以看成一种约定,对于所有实现了接口的类,可以说“它们都是这样的。”,但到底类是如何遵守与实施接口的规定,完全由类自己决定,由于在,C#,中一个类只能单继承,但是可以实现多接口,所以接口在,.NET,编程中用得极广,接口的小结与抽象基类相比,接口不含任何的实现代码,11,什么是多态,“多态性”一词最早用于生物学,指同一种族的生物体具有相同的特性,在面向对象理论中,多态性的定义是:同一操作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的结果,简单的说,同样程序语句,在不同的上下文环境中可能得到不同的运行结果,什么是多态“多态性”一词最早用于生物学,指同一种族的生物体具,12,继承多态,v1,假定某动物园管理员每天需要给所负责饲养的动物:狮子、猴子和鸽子喂食,编程模拟该过程,继承多态v1假定某动物园管理员每天需要给所负责饲养的动物:狮,13,类图,v1,共四个类,三种动物三个类,饲养员一个类,类图v1共四个类,三种动物三个类,饲养员一个类,14,喂食动物,v1,创建动物和饲养员,饲养员挨个喂动物,喂食动物v1创建动物和饲养员饲养员挨个喂动物,15,喂食过程,V1,这种编程方式存在什么问题?,在,Feeder,中增加第四个方法,FeedPanda,(),在,Feeder,中删除方法,FeedLion,(),喂食过程V1这种编程方式存在什么问题?在Feeder中增加第,16,存在问题,如果大熊猫也交给他管理,该如何修改,?,增加动物类,panda,饲养员类中增加喂食,panda,的方法,,FeedPanda(),如果日后狮子不归他管理,该如何修改?,删除动物类,Lion,饲养员类中删除喂食,Lion,的方法,,FeedLion(),继承,多态,存在问题如果大熊猫也交给他管理,该如何修改?,17,继承多态,v2,显然,无论狮子、猴子还是鸽子都是一种动物,因此,建立一个抽象基类,Animal,,狮子等从其派生出来,由于不同种类的动物吃不同的食物,所以在,Animal,中定义一个抽象方法,eat(),,由子类去负责具体的实现,同时,之前饲养员的三个喂食动物的方法合并为一个,FeedAnimal,方法,继承多态v2显然,无论狮子、猴子还是鸽子都是一种动物,因此,,18,类图,V2,类图V2,19,喂食过程,V2,喂食动物方法的参数类型是抽象基类,Animal,传递的参数类型为,Lion,、,Monkey,、,Pigeon,对象,它们都是,Animal,的子类,为什么可以这样?,子,类对象可以被当作基类对象,使用,喂食过程V2喂食动物方法的参数类型是抽象基类Animal传递,20,两个问题的解决,如果增加一种,需要,喂食的动物,如,panda,,该如何修改?,增加一个类,Panda,,继承自抽象基类,Animal,,实现,eat(),增加喂食,Panda,,,FeedAnimal(Animal panda),饲养员类无需修改,如果减少一种需要喂食的动物,如:,Monkey,,该如何修改?,删除类,Monkey,,,删除喂食,Monkey,两个问题的解决如果增加一种需要喂食的动物,如panda,该如,21,仍然存在的问题,冗余,仍然存在的问题冗余,22,类图,V3,喂食一群动物的方法,FeedAnimals,,参数类型为,Animal,数组,如果现在增加一种动物需要喂养,该怎么办?减少一种动物又该如何?,类图V3喂食一群动物的方法FeedAnimals,参数类型为,23,冗余的解决,如果此时再增加或减少一种需要喂食的动物,如:,panda,,该怎么办?,增加动物类,panda,,继承自抽象基类,Animal,,实现,eat(),实例化,panda,,,new panda(),放,入,Animal,,作为参数传给喂食方法,FeedAnimals(Animal),饲养员,类不需要修改,冗余的解决如果此时再增加或减少一种需要喂食的动物,如:pan,24,接口多态,狮子、猴子会跑步,鸽子会飞,此时该如何修改模型?,建立接口,IRun,和,IFly,,动物实现对应接口,接口多态狮子、猴子会跑步,鸽子会飞,此时该如何修改模型?建立,25,接口多态应用,一群动物奔跑的方法,Runs,,参数类型为,IRun,接口数组,狮子实现接口,IRun,接口多态应用一群动物奔跑的方法Runs,参数类型为IRun接,26,多态小结,1,多态有两种形式,继承多态(,IS_A,),接口多态(,CAN_DO,),通过示例可知,在编程中应用多态,可以使得我们的代码具有更强的适用性,当需求变化时,多态特性可以帮助我们将需要改动的地方减少到最低限度,多态小结1多态有两种形式,27,多态小结,2,多态是面向对象技术中,最精华,的部分,之一,在面向对象程序设计中应用多态,可简化为:,继承,实现对象的,统一管理,接口,定义对象的,行为特征,多态小结2多态是面向对象技术中最精华的部分之一,28,END,Thanks!,ENDThanks!,29,
展开阅读全文