面向对象多态变量泛型框架ppt课件_第1页
面向对象多态变量泛型框架ppt课件_第2页
面向对象多态变量泛型框架ppt课件_第3页
面向对象多态变量泛型框架ppt课件_第4页
面向对象多态变量泛型框架ppt课件_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

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

文档简介

1、n 多态变量是指可以援用多种对象类型的变 量。 n 这种变量在程序执行过程可以包含不同类 型的数值。 n 对于动态类型言语,一切的变量都能够是 多态的。 n 对于静态类型言语,多态变量那么是交换 原那么的详细表现。 n Parent variable=new Child(); 8/15/20211. n 很少运用赋值,通常是伴随着函数或 方法调用,经过数值和参数之间的绑 定来实现的。 8/15/20212. n 简单变量 n 接纳器变量 n 反多态 n 纯多态(多态方法) 8/15/20213. public class Solitairepublic class Solitaire . .

2、. . static CardPile allPiles;static CardPile allPiles; . . . . public void paint(Graphics g)public void paint(Graphics g) for(int i=0;i13;i+)for(int i=0;i13;i+) allPiles.display(g);allPiles.display(g); 8/15/20214. n 规划管理器规划管理器LayoutManagerLayoutManager是一个接口是一个接口 n 规范库为这个接口提供了几种不同的规范库为这个接口提供了几种不同的 实现

3、实现 n 经过调用承继自经过调用承继自ComponentComponent类的类的 setLayoutManagersetLayoutManager方法,将参数赋值方法,将参数赋值 给本地多态变量给本地多态变量 8/15/20215. n 多态变量最常用的场所是作为一个数 值,用来表示正在执行的方法内部的 接纳器。 n 隐藏 n 伪变量 smalltalk:self, C+,Java,C#:this 8/15/20216. class ThisExampleclass ThisExample public void one(int x)public void one(int x) value=

4、x+4;value=x+4; two(x+3);two(x+3); private int value;private int value; private void two(int y)private void two(int y) System.out.println(“Value System.out.println(“Value isis+(value+y);+(value+y); 8/15/20217. class ThisExampleclass ThisExample public void one(int x)public void one(int x) this.value=

5、x+4;this.value=x+4; this.two(x+3);this.two(x+3); private int value;private int value; private void two(int y)private void two(int y) System.out.println(“Value System.out.println(“Value isis+(this.value+y);+(this.value+y); 8/15/20218. n 多态接纳器功能的强大之处表如今音 讯传送与改写相结合时。这种结合是 软件框架开发的关键。 n 普通框架系统中的方法分为两大类:

6、n 在父类中定义根底方法,被多个子类 所承继,但不被改写; n 父类定义了关于多种活动的方法,但 要延迟到子类才实现。 8/15/20219. n 由于根底方法被子类所承继,因此它 们可以用于各个子类实例。 n 接纳器变量多态性的展现。 n 当执行根底方法时,接纳器实践上保 管的是一个子类实例的数值。 n 当执行一个改写方法时,执行的是子 类的方法,而不是父类的方法。 8/15/202110. class Windowclass Window public void repaint()public void repaint() paint(graphicsContext);paint(grap

7、hicsContext); abstract public void paint(Graphics abstract public void paint(Graphics g); private Graphics graphicsContext;g); private Graphics graphicsContext; class GraphicsWindow extends Windowclass GraphicsWindow extends Window public void paint(Graphics g)public void paint(Graphics g) /do the a

8、ppropriate painting /do the appropriate painting jobjob 8/15/202111. n 根底方法执行延迟方法的方式。 n 该结合允许在不修正原始代码的条件 下,裁剪延迟方法以顺应新的情势。 是处理软件复用问题的关键。 8/15/202112. 8/15/202113 n向下外型是处置多态变量的过程,并 且在某种意义上这个过程的取消操作 就是交换。 n可以将其赋值给一个声明为子类的变 量吗? n该取消多态赋值的过程,也称为反多 态。 . 8/15/202114 n常用的数据构造:集合、堆栈、队列、 列表。容器对象。 n可复用的软件组件。 n将

9、不同的对象放入一个集合,取出时, 如何知道对象的类型呢? . 8/15/202115 Child aChild If (aVariable instanceof Child ) aChild = ( Child ) aVariable . 8/15/202116 n多态方法 n支持可变参数的函数。 n支持代码只编写一次、高级别的笼统 n以及针对各种情况所需的代码裁剪。 n通常是经过给方法的接纳器发送延迟 音讯来实现这种代码裁剪的。 . 8/15/202117 n关于纯多态的一个简单实例就是用JAVA言 语编写的StringBuffer类中的append方法。 这个方法的参数声明为Object类

10、型,因此 可以表示任何对象类型。 nClass Stringbuffer nString append(Object value) nreturn append(value,toString(); n n n方法toString被延迟实现。 . 8/15/202118 n方法toString在子类中得以重定义。 ntoString方法的各种不同版本产生不同的 结果。 n所以append方法也类似产生了各种不同的 结果。 nAppend;一个定义,多种结果。 . 当讨论设计优秀的软件时,通常会提到“即插即 用(plug-and-play)的概念。即插即用的概念是指, 某物体可以被“插入(plug

11、ged)系统并可以在不 需求任何其他任务如重新设置系统的情况下 立刻“运用(played)。这个术语通常在讨论计算 机硬件时运用,比如将卡片插入计算机的扩展槽 中并可以立刻便用。 但是,这个概念也同样适用于计算机软件,尤其 是假设软件是优雅的,那么就可以删除某类的一 个对象,并轻松地交换,或“插入另一个“同 等的类的对象,而该过程将自动完成或只需极 少量的代码改动。 .19 来看一看集合类的例子,这些类是被用做其他对象的存储容器。 为了便于此处的讨论,假设您曾经多次运用过java.utiI.LinkedList类, 并将其作为大型软件系统中的集合类。 假设经过系统的测试及运用,发现Linked

12、List在系统的某些部分运转过 于缓慢,其缘由是获取列表中第n个数据需求遍历列表中前n个元素。 此时,一个很好的处置方法是将某些地方运用的LinkedList类交换为另 一种集合类,比如将数据存储在数组中因此可以在常数时间内进展随 机访问的ArrayList类。问题在于这样的交换能够会需求对系统做一些 大的改动。 .20 假设软件设计时并没有思索到这样的交换,那么首先就需 求寻觅出系统中一切声明和或初始化了LinkedList类型 的变量的地方,然后判别能否要将其交换为ArrayList类型 的变量的声明和或初始化。 但是,这样的声明或者初始化能够遍及在整个程序包中。 假设没有发现一切应该改动

13、的地方并进展合理的改动,那 么会导致错误的产生 .21 第二,假设运用了某些特定于LinkedList类的方法,如addFirst和 addLast那么需求修正这些方法调用。这些方法调用需求被交换为运 用ArrayList对象的相应代码。 不仅仅是这些修正将导致宏大的任务量,假设以后发现ArrayList对象 也不够满足需求而需求引入第三个集合类时,这样的整个过程还需求 再次反复。 这些改动将非常耗时,而且,它们还能不测地引入更多新错误。理想 情况下,可以对系统代码只进展一个改动就改动系统对集合类的运用。 .22 为了彻底清理代码以便未来可以随便改动代码, 第一步便是要认识到,LinkedLi

14、st类和ArrayList类都实现 了List接口。 下一步便是察看List接口的方法能否满足了系统内部对集 合类的一切需求。假设可以满足需求,那么系统内一切运 用这些集合的地方,都应该调用List接口的方法,而不是 特定于LinkedList类或ArrayList类的方法。 .23 第三步便是处置一切LinkedList类型的变量的声明和初始 化。为了防止以后对声明的改动,一切集合变量都要被声 明为“实现了List接口中一切方法的对象(objects-that- implement-all-the-methods-in-our-List-interface)的类型, 而不是将这些变量声明为诸

15、如LinkedList的详细类的对象。 也就是说,将变量声明为某种通用的List类型,可以允许 这些变量指向实现了List接口的任何对象。那么以后改动 设计来运用实现了List接口的新的集合类时,就不用再改 动变量声明了。 .24 还需求再处理一个问题。这个问题和容器变量的声明无关, 而是关于这些变量的初始化。假设需求改动代码来使 ArrayList对象替代LinkedList对象,那么代码中一切具有 如下方式的语句 List list = new LinkedList(); 都需求判别能否要交换成如下的方式。 List list = new ArrayList () ; .25 如何最小化任

16、务量,来保证在改动变量初始化的 时候,可以够最小化由这样的改动而引入错误的 几率呢? 更进一步说,能否可以使得代码更易于以后的改 动?处理问题的方法就是将需求改动的代码部分 化。在需求初始化集合变量的地方,我们运用 “工厂(factory)方法替代前面的方式利用构造函 数来创建新的对象,这个方法创建或者发现并前 往所需对象 .26 它能够会调用构造函数来创建新对象,或者它能够循环利 用曾经存在的可用对象存储在对象池或真仓库中,。 比如,您的系统能够有一个Manager类,该类具有工厂方 法createNewList方法,该方法创建并前往LinkedList类或 ArrayList类的一个对象:

17、 Public list createNewList () Return new LinkedList () .27 一开场,能够会觉得将对LinkedList的构造函数的调用交换为对 createNewList方法的调用并没有多大的提高,由于createNewList方 法也仅仅是调用LinkedList的构造函数并前往。而真正的提高在于,一 切对于容器变量的初始化语句可以被交换为如下的代码。 List list = manager.createNewList () ; 假设系统需求运用ArrayList对象来交换LinkedList对象,那么整个系统 中只需一个地方需求改动:Manager

18、类的createNewList方法。这个情 形的一个处理方式就是按如下方式编写代码。 Public Collection createNewList () Return new ArrayList () ; ) .28 n 泛型经过类型的运用提供了一种将类或 者函数参数化的方法。 n 与通常的函数参数一样,泛型提供了一 种无需识别特定数值的定义算法的方法。 8/15/202129. n 泛型将称号定义为类型参数。 n 在编译器读取类描画时,无法知道类 型的属性,但是该类型参数可以像类 型一样用于类定义内部。 n 在未来的某一时辰,会经过详细的类 型来匹配这一类型参数,这样就构成 了类的完好声明

19、。 n C+支持 8/15/202130. 我们先来看看一个只能持有单个对象的类。 8/15/202131. 在Java SE5之前,我们可以让这个类直接持有 Object类型的对象: 8/15/202132. 有些情况下,我们确实希望容器可以同时持有多 种类型的对象。但是,通常而言,我们只会运用 容器来存储一种类型的对象。泛型的主要目的之 一就是用来指定容器要持有什么类型的对象,而 且由编译器来保证类型的正确性。 8/15/202133. 因此,与其运用Object,我们更喜欢暂时不 指定类型,而是稍后再决议详细运用什么类 型。要到达这个目的,需求运用类型参数, 用尖括号括住,放在类名后面。

20、然后在运用 这个类的时候,再用实践的类型交换此类型 参数。在下面的例子中,T就是类型参数: 8/15/202134. 8/15/202135. 如今,当他创建Holder3对象时,必需指明想持有 什么类型的对象,将其置于尖括号内。就像main() 中那样。然后,他就只能在Holder3中存入该类型 或其子类,由于多态与泛型不冲突的对象了。 并且,在他从Holder3中取出它持有的对象时,自 动地就是正确的类型。 这就是Java泛型的中心概念:通知编译器想运用 什么类型,然后编译器帮他处置一切细节。 8/15/202136. 泛型也可以运用于接口。例如生成器 generator,这是一种专门担任

21、创建对象的类。 8/15/202137. 我们需求IA的doSomething前往的是一个对象这个对象extends于 BaseBean Interface IA public T doSomething(); class IAImpl implements IA public ChildBean doSomething() return new ChildBean(); 这样当他调用这个实现的时候就能明确地得到前往的对象类型 8/15/202138. Template T max(T left,T right) /return largest argument if(leftright) r

22、eturn right; return left; 称号T是一个参数,但是它不同于函数的两个参数。 在函数的代码体中,T可以用于任何适宜的类型。 8/15/202139. 1.代码体功能决议。并非函数头强加的 2.本例要求可比较 8/15/202140. Template class Box public: Box(T initial):value(initial) T getValue()return value; setValue(T newValue)value=newValue; private: T value; ; 8/15/202141. n 为了创建模板实例,模板参数必需与 详

23、细类型联络起来。 n Box(int) iBox(7); n CoutiBox.getValue(); ? n iBox.setValue(12); n CoutiBox.getValue(); ? n 参数必需与接纳器的类型相匹配 n iBox.setValue(3.1415);/ERROR,inv alid type 8/15/202142. n 模板类普通用于开发容器类 n Template class List n Public: nvoid add ( T ); nT firstElement( ); nT value; n Private: nList * nextElement

24、8/15/202143. n 在不允许改动原有类的情况下,如何 未来自两个或者更多个不同类的元素 结合起来。 n 例如以一致的表示方式来处置。 8/15/202144. n Apple类:运用printOn方法将本身输出。 n Orange类:运用writeTo方法将本身输 出。 n 二进制提供 n 希望将Apple对象和Orange对象保管在 同一个列表中,并且运用一个多态函 数将它们输出。 8/15/202145. n 定义一个公共的父类,具有共同行为 n Class Fruit npublic: nvirtual void print (ostream /纯虚方法 n ; 8/15/20

25、2146. n 运用模版,创建一个fruit adapter类,将 以Apple或者Orange为参数,同时符合水果 的定义 n Template n Class FruitAdapter : public Fruit n Public: n FruitAdapter (T n virtual void print ( ostream n Public: nT n ; 8/15/202147. n 运用模版函数简化适配器的创建过程 n Template n Fruit * newFruit ( T n ; 8/15/202148. Apple anApple(“RomeApple anAppl

26、e(“Rome);); Orange anOrange;Orange anOrange; ListFruit List fruitList; fruitList; fruitList.insert(newFruit(anApple);fruitList.insert(newFruit(anApple); fruitList.insert(newFruit(anOrange);fruitList.insert(newFruit(anOrange); ListFruit List :iterator start = fruitList.begin(); :iterator start = frui

27、tList.begin(); ListFruit List :iterator stop = fruitList.end(); :iterator stop = fruitList.end(); For ( ;start!=stop; +start) For ( ;start!=stop; +start) Fruit start; aFruit.print(cout); aFruit.print(cout); 8/15/202149. n 对于一类类似问题的骨架处理方案。 n 经过类的集合构成,类之间严密结合,共 同实现对问题的可复用途理方案 n 承继和改写的强大才干表达 n 最常见的框架 n

28、 Java中的GUI框架 n Web开发中的Struts框架 8/15/202150. n 框架开发的一个重要根底 n 运用承继的两种方式: n 代码复用:根本方法,对问题的现存 的处理方案。 n 概念复用:特化方法,用于特定运用 的处理方案。 8/15/202151. n 例:雇员排序。 8/15/202152. class Employee public: string name; int salary; int startingYear; 8/15/202153. void sort (Employee void sort (Employee * * data , int n) data

29、 , int n) for (int i = 1; i n; i+) for (int i = 1; i = 0 temp = vj; vj = vj+1;vj = vj+1; vj+1 = temp;vj+1 = temp; j = j - 1;j = j - 1; 8/15/202154. n 按照薪水排序? n 按照姓名排序? n 不再对雇员记录排序,对一个浮点数 组排序? 8/15/202155. n 源代码级的修正。 n 复用的是排序的思想,不是真正的实 现。 8/15/202156. n 需求源代码级的修正的地方? n 元素类型、元素数目、数值比较、元 素交换。 n 封装改动 8/

30、15/202157. class InsertionSorter class InsertionSorter public:public: void sort () void sort () int n = size();int n = size(); for (int i = 1; i n; i+) for (int i = 1; i = 0 swap(j, j+1); j = j - 1;j = j - 1; 8/15/202158. private: virtual int size() = 0; / abstract methods virtual boolean lessThan(i

31、nt i, int j) = 0; virtual void swap(int i, int j) = 0; 8/15/202159. class EmployeeSorter : public InsertionSorter public: EmployeeSorter (Employee * d, int n) data = d; sze = n; private: Employee * data; int sze = n; virtual int size () return sze; virtual bool lessThan (int i, int j) return datai-s

32、tartingYear startingYear; 8/15/202160. virtual void swap (int i, int j) Employee * temp = vi; vi = vj; vj = temp; 8/15/202161. n 基类不再需求改动。 n 特化子类满足不同的需求。 n 如: n 改动为对收入进展排序只需改动子类, 无需改动父类 n 对浮点数进展排序也只需创建一个新 的子类,而无需改动父类 8/15/202162. n 承继允许进展高级别算法细节的封装 n 还允许在不改动原始代码的情况下修 正或特化这些细节。 8/15/202163. n 框架改动了运用

33、程序(开发者定义的代码) 与库代码之间的关系 n 传统的运用程序中 n 运用程序特定的代码定义了程序执行的总 体流程 n 在框架中 n 控制流是由框架决议的,并且随运用程序的 不同而不同 n 新的运用程序的创建者只需改动供框架调 用的例程即可,而无需改动总体构造. n 框架占主导位置,而运用程序特定的代码处 于次要位置. 8/15/202164. n 面向对象设计艺术面向对象设计艺术 n 为运用程序预言未来能够发生的变化为运用程序预言未来能够发生的变化, ,并对运用并对运用 程序进展相应的设计程序进展相应的设计 n 做到这点不容易做到这点不容易, , n 需求程序员认识到可以经过类似于以前处理

34、问题需求程序员认识到可以经过类似于以前处理问题 的方式或者现存软件系统的方式来处理新问题时的方式或者现存软件系统的方式来处理新问题时, , 才可以将该问题泛化才可以将该问题泛化, ,使其适宜于更广泛的运用使其适宜于更广泛的运用 程序程序 n 象象C+,C+,需求程序员区分哪些方法可以改写需求程序员区分哪些方法可以改写, ,以及以及 哪些方法不能改写哪些方法不能改写, ,这种方式过于生硬了这种方式过于生硬了 n 由于程序员在最初无法预言改写某个方法的需求由于程序员在最初无法预言改写某个方法的需求 8/15/202165. n 多个代理组成的团体? n 对象绑定到一同的衔接特性? 8/15/202

35、166. n 一种思索对象互连的方式就是研讨可视性和依赖 性这两个概念。 n 可视性描画了关于称号的特性,经过该称号句柄 可以存取对象,假设对象的称号是合法的且代表 该对象,那么在这个特定环境下该对象就是可见 的。 n 描画可视性的相关术语还包括标识符的范畴 n 依赖性将两个对象或者类联络起来,在不存在另 外一个对象的条件下,假设一个对象的存在无任 何意义,就说该对象依赖于另外那个对象。 n 例如: 子类几乎总是依赖于它的父类 8/15/202167. n 耦合(coupling)和内聚(cohesion)的 思想提供了一个框架,用于评价对象 和类的运用能否有效。 n 耦合描画类之间的关系,内

36、聚描画类 内部的关系。 8/15/202168. n 从最差的耦合到较好的耦合: n 内部数据耦合 n 全局数据耦合 n 控制或顺序耦合 n 组件耦合 n 参数耦合 n 子类耦合 8/15/202169. n 内部数据耦合发生在当一个类的实例直接修正另外一个类内部数据耦合发生在当一个类的实例直接修正另外一个类 中的本地数据值实例变量时。中的本地数据值实例变量时。 n Class SneakyModifierClass SneakyModifier npublic:void sneaky()public:void sneaky() n/change my friends name/change

37、my friends name nmyFriend-name=“LucymyFriend-name=“Lucy; ; n nPerson Person * *myFriend;myFriend; n ; n Class PersonClass Person npublic:Person()public:Person() nname=“Larryname=“Larry; ; n nstring name;string name; n ;8/15/202170. n 全局数据耦合发生在两个或者更多个类型都依赖全局数据耦合发生在两个或者更多个类型都依赖 于公用的全局数据构造而绑定到一同的时候。于公用

38、的全局数据构造而绑定到一同的时候。 n Double todaysDow;Double todaysDow; n Class OneClass One npublic:void setDow()public:void setDow() ntodayDow=9473;todayDow=9473; n n Class TwoClass Two npublic:void printDow()public:void printDow() ncout“Today the Dow hitcout“Today the Dow hit todaysDow;todaysDow; n n ; 8/15/20217

39、1. n 一个类必需以一种由任何位置控制的特定的顺序来执行操一个类必需以一种由任何位置控制的特定的顺序来执行操 作。作。 n class MyClass class MyClass n public:public: ndoFirst() . doFirst() . ndoSecond() . doSecond() . ndoThird() . doThird() . n 8/15/202172. n 被顺序化的类应确保本身可以以正确的顺被顺序化的类应确保本身可以以正确的顺 序实现操作,不应仅依赖于调用者的正确序实现操作,不应仅依赖于调用者的正确 处置处置 n class MyClass cla

40、ss MyClass n public:public: ndoStuff () doStuff () ndoFirst();doFirst(); ndoSecond();doSecond(); ndoThird();doThird(); n n protected:protected: ndoFirst() . doFirst() . ndoSecond() . doSecond() . ndoThird() . doThird() . n 8/15/202173. n 组件耦合发生在一个类包含的数据字 段或数值为另外一个类的实例时 n Class Set n. n. nprivate: nList data; n ; 8/15/202174. n 参数耦合发生在一个类必需调用另外一个类的效 力和例程时,此时两个类之间所发生的独一关系 就是一个类需求为另一个类提供参数数目、类型 和前往值类型。 n Class myClass npublic: nvoid doSomething(Set aset) n/do somet

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论