面向对象继承优秀课件.ppt
《面向对象继承优秀课件.ppt》由会员分享,可在线阅读,更多相关《面向对象继承优秀课件.ppt(81页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、面向对象继承第1页,本讲稿共81页10/12/20222n这种把继承作为一种扩展同时也作为一种收缩的思想,正是面向对象技术强大的原因,同时也会在正常的部署中引起混淆。扩展与简化 第2页,本讲稿共81页10/12/20223n继承总是向下传递的,因此一个类可以从它上面的多个超类中继承各种属性。n如果Dog是Mammal的派生类,而Mammal又是Animal的派生类,则Dog不仅继承了Mammal的属性,同时也继承了Animal的属性。n派生类可以覆盖从基类继承来的行为。继承是向下传递的 第3页,本讲稿共81页10/12/20224n代码复用n概念复用。共享方法的定义。继承的作用第4页,本讲稿共
2、81页10/12/20225n检验两个概念是否为继承关系“是一个”检验第5页,本讲稿共81页10/12/20226class Parent private:int three;protected:int two;public:int one;Parent()one=two=three=42;void inParent()cout one two three;/all legal;Public,Private and Protected第6页,本讲稿共81页10/12/20227class Child:public Parent public:void inChild()cout one;/le
3、galcout two;/legalcout three;/error-not legal;Public,Private and Protected第7页,本讲稿共81页10/12/20228void main()Child c;cout c.one;/legalcout c.two;/error-not legalcout c.three;/error-not legalPublic,Private and Protected第8页,本讲稿共81页10/12/20229n在静态类型语言中n父类和子类数据类型的关系?1.子类实例必须拥有父类的所有数据成员。2.子类的实例必须至少通过继承实现父类
4、所定义的所有功能。3.这样,在某种条件下,如果用子类实例来替换父类实例,那么将会发现子类实例可以完全模拟父类的行为,二者毫无差异。观察第9页,本讲稿共81页10/12/202210n指如果类B是类A的子类,那么在任何情况下都可以用类B来替换类A,而外界毫无察觉。替换原则第10页,本讲稿共81页10/12/202211n指符合替换原则的子类关系。n区别于一般的可能不符合替换原则的子类关系子类型第11页,本讲稿共81页10/12/202212n子类有时为了避免继承父类的行为,需要对其进行改写n语法上:子类定义一个与父类有着相同名称且类型签名相同的方法。n运行时:变量声明为一个类,它所包含的值来自于
5、子类,与给定消息相对应的方法同时出现于父类和子类。n改写与替换结合时,想要执行的一般都是子类的方法。改写第12页,本讲稿共81页10/12/202213nJava、Smalltalk等面向对象语言,只要子类通过同一类型签名改写父类的方法,自然便会发生所期望的行为。nC+中,需要父类中使用关键字Virtual来表明这一含义。改写机制第13页,本讲稿共81页10/12/202214n与类一样,接口可以继承于其他接口,甚至可以继承于多个父接口。n虽然继承类和实现接口并不完全相同,但他们非常相似,因此使用继承这一术语来描述这两种行为n抽象方法:介于类和接口之间的概念。n定义方法但不实现。n创建实例前,
6、子类必须实现父类的抽象方法。nJava,C#:abstract C+:virtual接口和抽象类第14页,本讲稿共81页10/12/202215n特殊化(specialization)继承n规范化(specification)继承n构造(Construction)继承 n泛化继承n扩展继承 n限制继承 n变体继承n合并继承(多重继承)继承的形式第15页,本讲稿共81页10/12/202216n很多情况下,都是为了特殊化才使用继承。n在这种形式下,新类是基类的一种特定类型,它能满足基类的所有规范。用这种方式创建的总是子类型,并明显符合可替换性原则。n与规范化继承一起,这两种方式构成了继承最理想的
7、方式,也是一个好的设计所应追求的目标。nWindow-TextWindow特殊化继承第16页,本讲稿共81页10/12/202217n规范化继承用于保证派生类和基类具有某个共同的接口,即所有的派生类实现了具有相同方法界面的方法。n基类中既有已实现的方法,也有只定义了方法接口、留待派生类去实现的方法。派生类只是实现了那些定义在基类却又没有实现的方法。规范化继承第17页,本讲稿共81页10/12/202218n派生类并没有重新定义已有的类型,而是去实现一个未完成的抽象规范。也就是说,基类定义了某些操作,但并没有去实现它。只有派生类才能实现这些操作。n在这种情况下,基类有时也被称为抽象规范类。规范化
8、继承第18页,本讲稿共81页10/12/202219n在Java中,关键字abstract确保了必须要构建派生类。声明为abstract的类必须被派生类化,不可能用new运算符创建这种类的实例。除此之外,方法也能被声明为abstract,同样在创建实例之前,必须覆盖类中所有的抽象方法。n规范化继承可以通过以下方式辨认:基类中只是提供了方法界面,并没有实现具体的行为,具体的行为必须在派生类中实现。nGraphicalObject没有实现关于描绘对象的方法,因此它是一个抽象类。其子类Ball,Wall和Hole通过规范子类化实现这些方法。规范化继承第19页,本讲稿共81页10/12/202220n
9、一个类可以从其基类中继承几乎所有需要的功能,只是改变一些用作类接口的方法名,或是修改方法中的参数列表。n即使新类和基类之间并不存在抽象概念上的相关性,这种实现也是可行的。构造继承 第20页,本讲稿共81页10/12/202221n当继承的目的只是用于代码复用时,新创建的子类通常都不是子类型。这称为构造子类化。n一般为了继承而继承,如利用一些工具类已有的方法。构造子类化第21页,本讲稿共81页10/12/202222n构造子类化经常违反替换原则(形成的子类并不是子类型)构造子类化第22页,本讲稿共81页10/12/202223n与特化子类化相反?n派生类扩展基类的行为,形成一种更泛化的抽象。nW
10、indow-ColoredWindow泛化子类化第23页,本讲稿共81页10/12/202224n泛化子类化通常用于基于数据值的整体设计,其次才是基于行为的设计。泛化子类化第24页,本讲稿共81页10/12/202225n如果派生类只是往基类中添加新行为,并不修改从基类继承来的任何属性,即是扩展继承。(泛化子类化对基类已存在的功能进行修改或扩展,扩展子类化则是增加新功能)n由于基类的功能仍然可以使用,而且并没有被修改,因此扩展继承并不违反可替换性原则,用这种方式构建的派生类还是派生类型。扩展继承 第25页,本讲稿共81页10/12/202226n如果派生类的行为比基类的少或是更严格时,就是限制
11、继承。n常常出现于基类不应该、也不能被修改时。n限制继承可描述成这么一种技术:它先接收那些继承来的方法,然后使它们无效。n双向队列-堆栈限制继承 第26页,本讲稿共81页10/12/202227n由于限制继承违反了可替换性原则,用它创建的派生类已不是派生类型,因此应该尽可能不用。限制继承 第27页,本讲稿共81页10/12/202228n两个或多个类需要实现类似的功能,但他们的抽象概念之间似乎并不存在层次关系。n控制鼠标=控制触摸屏w但是,在概念上,任何一个类作为另一个类的子类都不合适w因此,可以选择其中任何一个类作为父类,并改写与设备相关的代码变体子类化第28页,本讲稿共81页10/12/2
12、02229n但是,通常使用的更好的方法是将两个类的公共代码提炼成一个抽象类,比如PointingDevice,并且让这两个类都继承于这个抽象类。n与泛化子类化一样,但基于已经存在的类创建新类时,就不能使用这种方法了。变体子类化第29页,本讲稿共81页10/12/202230n可以通过合并两个或者更多的抽象特性来形成新的抽象。n一个类可以继承自多个基类的能力被称为多重继承。n助教合并继承 第30页,本讲稿共81页10/12/202231n创建匿名类的条件w只能创建一个匿名类的实例w匿名类必须继承于父类或接口,并且不需要构造函数进行初始化。p.add(new ButtonAdapter(“Quit
13、”)public void pressed()System.exit(0););Java语言中的匿名类 第31页,本讲稿共81页10/12/202232n继承使得构造函数这个过程变得复杂w由于父类和子类都有待执行的初始化代码,在创建新对象时都要执行wJava等语言n只要父类构造函数不需要参数,父类的构造函数和子类的构造函数都会自动地执行。n当父类需要参数时,子类必须显示地提供参数。在java中通过super这个关键字来实现。继承和构造函数 第32页,本讲稿共81页10/12/202233n子类关系是通过创建新类的声明语句来建立的,但它并未解释子类存在的意义和目的。第10章 子类和子类型第33页
14、,本讲稿共81页10/12/202234n可替换性是面向对象编程中一种强大的软件开发技术。n可替换性的意思是:变量声明时指定的类型不必与它所容纳的值类型相一致。n这在传统的编程语言中是不允许的,但在面向对象的编程语言中却常常出现。可替换性第34页,本讲稿共81页10/12/202235n如果说新类是已存在类的子类型,那么这个新类不仅要提供已存在类的所有操作,而且还要满足于这个已存在类相关的所有属性。n因此,即使符合堆栈的接口定义,但是不满足堆栈的属性特征,也不是子类型子类与子类型间的差异第35页,本讲稿共81页10/12/202236n子类型关系是通过行为这个术语描述的,与新类的定义或构造无关
15、。n例如:Dictionary类支持与Array类相同的接口,因此即使Dictionary类与Array类之间并不存在继承关系,但是也可以说Dictionary是Array的子类型。第36页,本讲稿共81页10/12/202237n面向对象语言的强大之处在于对象可以在运行时动态地改变其行为。n编程语言中,术语静态总是用来表示在编译时绑定于对象并且不允许以后对其进行修改的属性或特征。n术语动态用来表示直到运行时绑定于对象的属性或特征。第11章 静态行为和动态行为第37页,本讲稿共81页10/12/202238n变量的静态类是指用于声明变量的类。静态类在编译时就确定下来,并且再也不会改变。n变量的
16、动态类指与变量所表示的当前数值相关的类。动态类在程序的执行过程中,当对变量赋新值时可以改变。静态类和动态类第38页,本讲稿共81页10/12/202239n对于静态类型面向对象编程语言,在编译时消息传递表达式的合法性不是基于接收器的当前动态数值,而是基于接收器的静态类来决定的。nP167 例子静态类型和动态类型的区别第39页,本讲稿共81页10/12/202240n替换原则可以通过提升数值在继承层次上的位置来体现。n有时则相反,还需要判断一种变量目前所包含的数值是否为类层次中的低层次类。运行时类型决定第40页,本讲稿共81页10/12/202241n做出数值是否属于指定类的决定之后,通常下一步
17、就是将这一数值的类型由父类转换为子类。这一过程称为向下造型,或者反多态,因为这一操作所产生的效果恰好与多态赋值的效果相反。向下造型(反多态)第41页,本讲稿共81页10/12/202242n静态方法绑定/动态方法绑定n响应消息时对哪个方法进行绑定是由接收器当前所包含的动态数值来决定的。方法绑定第42页,本讲稿共81页10/12/202243Animal pet;pet=new Dog();pet.speak();pet=new bird();pet.speak();例?第43页,本讲稿共81页10/12/202244n如果方法所执行的消息绑定是由最近赋值给变量的数值的类型来决定的,那么就称这个
18、变量是多态的。nJava,Smalltalk等变量都是多态的。nC+声明为简单类型的变量,非多态。多态变量?第44页,本讲稿共81页10/12/2022451.使用指针或引用;2.相关方法声明为virtual;才可以实现多态消息传递。C+第45页,本讲稿共81页10/12/202246n继承和替换原则的引入对编程语言的影响w类型系统w赋值的含义w等价测试w复制建立w存储分配第12章 替换的本质第46页,本讲稿共81页10/12/202247n从特定的类实例化对象是需要多少存储空间?内存布局第47页,本讲稿共81页10/12/202248n引入派生类包含基类所不包含的数据?内存布局第48页,本讲
19、稿共81页10/12/202249class Window public:virtual void oops();private:int height;int width;class TextWindow:public Window public:virtual void oops();private:char*contents;int cursorLocation;例第49页,本讲稿共81页10/12/202250nWindow win;n为win分配空间的方案?例第50页,本讲稿共81页10/12/2022511.只分配基类所需的存储空间。2.无论基类还是派生类,都分配可用于所有合法的数值
20、的最大的存储空间。3.只分配用于保存一个指针所需的存储空间。在运行时通过对来分配书之所需的存储空间,同时将指针设为相应的合适值。分配方案第51页,本讲稿共81页10/12/202252nC+使用最小静态空间分配策略。运行高效?nWindow x;nTextWindow y;nx=y;?最小静态空间分配第52页,本讲稿共81页10/12/202253n 后果?切割Slicing第53页,本讲稿共81页10/12/202254nC+保证变量x只能调用定义于Window类中的方法,不能调用定义于TextWindow类中的方法。n定义并实现于Window类中的方法无法存取或修改定义于子类中的数据,因此
21、不可能出现父类存取子类的情况。最小静态空间分配第54页,本讲稿共81页10/12/202255n对于指针(引用)变量:当消息调用可能被改写的成员函数时,选择哪个成员函数取决于接收器的动态数值。n对于其他变量:关于调用虚拟成员函数的绑定方式取决于静态类(变量声明时的类),而不取决于动态类(变量所包含的实际数值的类)。C+规则第55页,本讲稿共81页10/12/202256n变量赋值过程中,数值从子类表示的类型转换为父类所表示的类型。n类似于将整型变量赋值给浮点型变量。n对于基于堆栈的变量,可以确保动态类总是等同于静态类。n所以不能对对象中不存在的字段进行存取。不必考虑赋值过程中的内存数据丢失。解
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 继承 优秀 课件
限制150内