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