“面向过程”和“面向对象与面向过程”的区别该怎么说

匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。[面向对象面向过程区别]面向对象和面向过程的区别
· · · ·
您当前的位置: → [面向对象面向过程区别]面向对象和面向过程的区别
[面向对象面向过程区别]面向对象和面向过程的区别
篇一 : 面向对象和面向过程的区别C是面向过程C++、 JAVA是面向对象面向对象和面向过程的区别1个博大,1个精深.总体而言,面向对象简单,面向过程对人员要求素质过高面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤1步1步实现,使用之际1个1个依次调用即可了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成1个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。艾兰.库伯的《软件创新之路》中提到:面向过程和面向对象的区别并不像人们想象得那么大面向对象的大部分思想在面向过程中也能体现但面向过程最大的问题(也许是唯一先天的缺陷)在于随着系统的膨胀,面向过程将无法应付,最终导致系统的崩溃面向对象的提出正是试图解决这一软件危机目前看来,似乎有一定成效但仍任重道远---------------------------------------------------------------做一些对比来说吧:分析 基本构件 方法 工具---------------------------------面向过程 基于算法 函数/过程 数据流图、伪代码... ...面向对象 基于对象 类 UML建模... Rose,viso等---------------------------------------------------------------其实我始终认为,不管是面向对象,还是面向过程,都体现了1种软件重用的思想!只不过面向过程中重用的是过程和函数,但是面向对象重用的是类,1种将数据和处理数据的过程及函数封装在一起的实体,其实面向对象中的过程和函数和面向过程中的分别不是很大,所以数据流图和伪代码还是有用的。面向对象1个很大的好处就是数据 和方法的封装,由此面向对象的3大特性得到发挥什么是面向对象 面向过程 面向事件 11:26面向过程是在面向对象出现之前,以及之后,甚至至今都应用于程序开发中的程序设计思想。面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤1步1步实现,使用之际1个1个依次调用即可了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成1个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。如:一辆汽车用面向过程的思想去考虑它应该是这样的:如何启动汽车、如何起步、加速、刹车、熄火等1个个操作。而汽车在这里并不是我们所关心的。而面向对象则以汽车为对象,一切由汽车开始,以上的可用操作,即功能是汽车这个对象本身所具有的,做任何操作只要告诉汽车即可了。C语言是面向过程的编程,它的最重要特点是函数,通过主函数来调用1个个子函数。程序运行的顺序都是程序员决定好了的。C++是面向对象的编程,类是它的主要特点,程序执行过程中,先由主函数进入,定义一些类,根据需要,执行类的成员函数,过程的概念被淡化了(实际上过程还是有的,就是主函数的那些语句),类就是对象,所以我们称之为面向对象程序设计。VisualC++,它是面向事件的编程,程序执行时,不断检测有没有事件(消息)发生,如果有,那么就看有没有对应于事件的函数,如果有就执行这个函数。相比之下,它过程式的味道几乎没有了,但是实际上也是面向过程的,这个过程就是检验有没有事件,只不过这个过程被隐藏了起来。面向过程是把所有的功能全部在1个大的类里定义出来,当系统庞大时,功能多了,各种操作之间的调用关系也很复杂,当需要修改1个功能时就可能引发一连串的改动,使修改和维护成本很昂贵。而面向对象,对把功能以对象为基本单位进行分类:这就是我们在面向对象程序设计中所常说的类了。我们知道在管理中有1种方法叫“授权”,意思是管理者把不同的任务交给相应的人去处理,这样就把责任分发到相应的负责人,管理者只需要记录谁负责什么即可,哪里出了问题或是没有完成任务,就找相应的负责人,只要修改相应的类以及极小部份的其他改动。面向对象的思想需要大家在实际工作中去慢慢体会,通过和面向过程的对比,我们就能发现它的优越性,进而更好地掌握运用。对于类的理解面向对象是在分析和解决问题之际,将涉及的数据和对数据的操作封装在类中。通过类可以创建对象。比方:可以构建1个Circle类,1个表示圆的类,它是半径不同的所有的圆的1个抽象的描述。通过类可以创建任意多个对象,这些对象之间是相互独立的。可以由圆类Circle创建圆c1和圆c2。而c1和c2是彼此独立的对象。这样,对于事物的观控粒度,由某个具体的对象扩大到1个类。这样符合人们认识事物的习惯。public class Circle{ privatedouble R;
// 圆的泛权——半径 public voidgetR(double r)
//设置圆的半径 { R=r; } public double getArea() //求圆的面积 { return3.14*R*R; }}面向对象和面向过程1.面向过程程序设计方法的实质上是从计算机处理问题的观点来进行程序设计工作:输入——运算——输出。面向过程程序设计者需要变更习惯的思维方法以贴近计算机的内部工作机理。面向过程程序设计所具有的流的工作性质,试图通过信息流及其转换来认识系统,不仅加大了程序设计的难度,同时亦使得程序的可理解性比较差。面向对象程序设计方法中,1种普遍采用的优化方法是使用结构化的程序设计方法。面向过程程序设计方法一般适宜采用自上而下的设计方法。面向过程程序设计方法需要在一开始就全面的,自上而下的设计整个应用程序的架构,因此要求程序设计者对问题域有全面的了解。面向过程程序设计方法很难复用以前已经设计完成的软件。2.面向对象程序设计是1种自下而上的程序设计方法,往往从问题的一部分着手,一点一点地构建出整个程序。面向对象设计一数据为中心,类作为表现数据的工具,成为划分程序的基本单位。面向对象有以下几个重要特点: (1)客观世界有对象组成 (2)对象抽象为类 (3)类与类之间存在继承关系 (4)对象之间通过传递消息而彼此联系关于面向过程及面向对象编程 10:00  从事软件开发的人可能同时用过面向过程及面向对象的编码,例如JAVA、C++、C#均是面向对象的语言、C语言是面向过程的语言、PHP既支持面向过程也支持面向对象的功能,面向过程及面向对象均有自己的优缺点,也均有自己的适用范围。  面向过程  优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。  缺点:没有面向对象易维护、易复用、易扩展  面向对象  优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护  缺点:性能比面向过程低  面向对象程序设计的一些显著的特性包括:  .程序设计的重点在于数据而不是过程;  .程序被划分为所谓的对象;  .数据结构为表现对象的特性而设计;  .函数作为对某个对象数据的操作,与数据结构紧密的结合在一起;  .数据被隐藏起来,不能为外部函数访问;  .对象之间可以通过函数沟通;  .新的数据和函数可以在需要之际轻而易举的添加进来;  .在程序设计过程中遵循由下至上(bottom-up)的设计方法。  面向对象程序设计在程序设计模式中是1个新的概念,对于不同的人可能意味着不同的内容。我们对面向对象程序设计的定义是"面向对象程序设计是1种方法,这种方法为数据和函数提供共同的独立内存空间,这些数据和函数可以作为模板以便在需要时创建类似模块的拷贝。这样的程序设计方法称为面向对象程序设计。"  从以上定义可以看到,1个对象被认为是计算机内存中的1个独立区间,在这个区间中保存着数据和能够访问数据的一组操作。因为内存区间是相互独立的,所以对象可以不经修改就应用于多个不同的程序中。  什么是面向对象程序设计?  面向对象程序设计(OOP)技术汲取了结构化程序设计中好的思想,并将这些思想与一些新的、强大的理念相结合,从而给你的程序设计工作提供了1种全新的方法。通常,在面向对象的程序设计风格中,你会将1个问题分解为一些相互关联的子集,每个子集内部都包含了相关的数据和函数。同时,你会以某种方式将这些子集分为不同等级,而1个对象就是已定义的某个类型的变量。当你定义了1个对象,你就隐含的创建了1个新的数据类型。  对象  在1个面向对象的系统中,对象是运行期的基本实体。它可以用来表示1个人或者说1个银行帐户,一张数据表格,或者其它什么需要被程序处理的东西。它也可以用来表示用户定义的数据,例如1个向量,时间或者列表。在面向对象程序设计中,问题的分析一般以对象及对象间的自然联系为依据。如前所述,对象在内存中占有一定空间,并且具有1个与之关联的地址,就像Pascal中的record和C中的结构一样。  当1个程序运行时,对象之间通过互发消息来相互作用。例如,程序中包含1个"customer"对象和1个"account"对象,而customer对象可能会向account对象发送1个消息,查询其银行帐目。每个对象都包含数据以及操作这些数据的代码。即使不了解彼此的数据和代码的细节,对象之间依然可以相互作用,所要了解的只是对象能够接受的消息的类型,以及对象返回的响应的类型,虽然不同的人会以不同的方法实现它们。  类  我们刚才提到,对象包含数据以及操作这些数据的代码。1个对象所包含的所有数据和代码可以通过类来构成1个用户定义的数据类型。事实上,对象就是类类型(classtype)的变量。一旦定义了1个类,我们即可创建这个类的多个对象,每个对象与一组数据相关,而这组数据的类型在类中定义。因此,1个类就是具有相同类型的对象的抽象。例如,芒果、苹果和桔子都是fruit类的对象。类是用户定义的数据类型,但在1个程序设计语言中,它和内建的数据类型行为相同。比如创建1个类对象的语法和创建1个整数对象的语法一模一样。  数据抽象和封装  把数据和函数包装在1个单独的单元(称为类)的行为称为封装。数据封装是类的最典型特点。数据不能被外界访问,只能被封装在同1个类中的函数访问。这些函数提供了对象数据和程序之间的接口。避免数据被程序直接访问的概念被称为"数据隐藏"。  抽象指仅表现核心的特性而不描述背景细节的行为。类使用了抽象的概念,并且被定义为一系列抽象的属性如尺寸、重量和价格,以及操作这些属性的函数。类封装了将要被创建的对象的所有核心属性。因为类使用了数据抽象的概念,所以它们被称为抽象数据类型(ADT)。  封装  封装机制将数据和代码捆绑到一起,避免了外界的干扰和不确定性。它同样允许创建对象。简单的说,1个对象就是1个封装了数据和操作这些数据的代码的逻辑实体。  在1个对象内部,某些代码和(或)某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。  继承  继承是可以让某个类型的对象获得另1个类型的对象的属性的方法。它支持按级分类的概念。例如,知更鸟属于飞鸟类,也属于鸟类。这种分类的原则是,每1个子类都具有父类的公共特性。  在OOP中,继承的概念很好的支持了代码的重用性(reusability),也就是说,我们可以向1个已经存在的类中添加新的特性,而不必改变这个类。这可以通过从这个已存在的类派生1个新类来实现。这个新的类将具有原来那个类的特性,以及新的特性。而继承机制的魅力和强大就在于它允许程序员利用已经存在的类(接近需要,而不是完全符合需要的类),并且可以以某种方式修改这个类,而不会影响其它的东西。  注意,每个子类只定义那些这个类所特有的特性。而如果没有按级分类,每类都必须显式的定义它所有的特性。  多态  多态是OOP的另1个重要概念。多态的意思是事物具有不同形式的能力。举个例子,对于不同的实例,某个操作可能会有不同的行为。这个行为依赖于所要操作数据的类型。比如说加法操作,如果操作的数据是数,它对2个数求和。如果操作的数据是字符串,则它将连接2个字符串。  多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过1个公共的类,它们(那些操作)可以通过相同的方式予以调用。多态在实现继承的过程中被广泛应用。  面向对象程序设计语言支持多态,术语称之为"one interface multiplemethod(1个接口,多个实现)"。简单来说,多态机制允许通过相同的接口引发一组相关但不相同的动作,通过这种方式,可以减少代码的复杂度。在某个特定的情况下应该作出怎样的动作,这由编译器决定,而不需要程序员手工干预。  在多函数程序中,许多重要的数据被声明为全局变量,这样它们才可以被所有的函数访问。每个函数又可以具有它自己的局部变量。全局变量很容易被某个函数不经意之间改变。而在1个大程序中,很难分辨每个函数都使用了哪些变量。如果我们需要修改某个外部数据的结构,我们就要修改所有访问这个数据的函数。这很容易导致bug的产生。  在结构化程序设计中,另1个严重的缺陷是不能很好的模拟真实世界的问题。这是因为函数都是面向过程的,而不是真正的对应于问题中的各个元素。  面向过程的程序设计的一些特点如下:  .强调做(算法);  .大程序被分隔为许多小程序,这些小程序称为函数;  .大多数函数共享全局数据;  .数据开放的由1个函数流向另1个函数。函数把数据从1种形式转换为另1种形式。  采用由上至下的程序设计方法。  动态绑定  绑定指的是将1个过程调用与相应代码链接起来的行为。动态绑定的意思是,与给定的过程调用相关联的代码只有在运行期才可知。它与多态和继承的联系极为紧密。1个多态引用的函数调用决定于这个引用的动态类型。  消息传递  1个面向对象的程序由许多对象组成,这些对象之间需要相互沟通。因此,在面向对象程序设计语言中,程序设计的主要步骤如下:  1、创建类,这些类定义了对象及其行为;  2、由类定义创建对象;  3、建立对象之间的通讯。  对象之间通过收发信息相互沟通,这一点类似于人与人之间的信息传递。信息传递的概念使得真实世界的直接模拟更易于和建立系统交流。  对于某个特定对象来说,消息就是请求执行某个过程,因此,消息的接收对象会调用1个函数(过程),以产生预期的结果。传递的消息的内容包括接收消息的对象的名字,需要调用的函数的名字,以及必要的信息。  对象就有1个生命周期。它们可以被创建和销毁。只要对象正处于其生存期,即可与其进行通讯。  OOP的优点  OOP具有许多优点,无论是对于程序设计者或者用户来说都是如此。面向对象为软件产品扩展和质量保证中的许多问题提供了解决办法。这项技术能够大大提高程序员的生产力,并可提高软件的质量以及降低其维护费用。其主要的优点陈列于下:  1、通过继承,我们可以大幅减少多余的代码,并扩展现有代码的用途;  2、我们可以在标准的模块上(这里所谓的"标准"指程序员之间彼此达成的协议)构建我们的程序,而不必一切从头开始。这可以减少软件开发时间并提高生产效率;  3、数据隐藏的概念帮助程序员们保护程序免受外部代码的侵袭;  4、允许1个对象的多个实例同时存在,而且彼此之间不会相互干扰;  5、允许将问题空间中的对象直接映射到程序中;  6、基于对象的工程可以很容易的分割为独立的部分;  7、以数据为中心的设计方法允许我们抓住可实现模型的更多细节;  8、面向对象的系统很容易从小到大逐步升级;  9、对象间通讯所使用的消息传递技术与外部系统接口部分的描述更简单;  10、更便于控制软件复杂度。  当需要将以上所说的所有特性有机的结合于1个面向对象系统中,它们之间的相对重要性就取决于工程的类型和程序员的喜好。为了获得上述的某些优势,必须考虑很多事情。例如,对象库必须可以被重用。技术都还在不停的发展,现有的产品也会很快的更新换代。如果重用没有能够实现,那么就需要进行严格的控制和管理。  易于使用的开发软件往往难以编写。面向对象程序设计工具有望解决这个问题。  面向对象程序设计语言  面向对象技术并不是某个特定语言的特权。如同结构化程序设计一样,OOP概念可以在很多语言比如C和Pascal中实现。但是,当程序越来越大时,程序设计工作会变得拙劣而混乱。而1个支持OOP概念的程序设计语言则可以让一切变得简单。  1个语言必须支持几个主要的OOP概念才能称其是面向对象的。根据所支持的OOP特性,语言可以分为以下2类:  1、基于对象的程序设计语言;  2、面向对象的程序设计语言。  基于对象的程序设计语言仅支持封装和对象辨识。  1个面向对象的程序设计语言所要支持的重要特性如下:  .数据封装  .数据隐藏和访问机制  .对象的自动初始化和清除  .操作符重载  支持对象风格程序设计的语言称为基于对象的程序设计语言。它们不支持继承和动态绑定。  Ada就是1个典型的基于对象的程序设计语言。  面向对象的程序设计不仅仅包含基于对象程序设计的特性,还支持继承和动态绑定。  OOP的应用  OOP最有前途的应用领域如下:  1、实时系统;  2、仿真和建模;  3、面相对象数据库;  4、超文本、超媒体和扩展文本;  5、AI和专家系统;  6、神经网络和并行程序设计;  7、决策支持和办公自动化系统;  8、CIM/CAM/CAD系统。  Via  业务逻辑比较简单的适合用面向过程,例如统计当前在线用户数,一条SQL语句即可搞定的没有多大必要用面向对象,也没有必要用什么设计模式,那样就是简单问题复杂化了。  业务逻辑比较复杂的适合用面向对象,这样当需求有变化时,维护起来会比较方便。  面向对象的局部是面向过程的,比如某个类里面某个方法里面实际就是面向过程的,而面向过程会借用面向对象的一些优点来进行优化。  网上发现了一篇文章,说了一下OP与OO的不同,并且打了1个比喻,通俗易懂。  有人这么形容OP和OO的不同:用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。所谓盖浇饭,北京叫盖饭,东北叫烩饭,广东叫碟头饭,就是在一碗白米饭上面浇上一份盖菜,你喜欢什么菜,你就浇上什么菜。我觉得这个比喻还是比较贴切的。  蛋炒饭制作的细节,我不太清楚,因为我没当过厨师,也不会做饭,但最后的一道工序肯定是把米饭和鸡蛋混在一起炒匀。盖浇饭呢,则是把米饭和盖菜分别做好,你如果要一份红烧肉盖饭呢,就给你浇一份红烧肉;如果要一份青椒土豆盖浇饭,就给浇一份青椒土豆丝。  蛋炒饭的好处就是入味均匀,吃起来香。如果恰巧你不爱吃鸡蛋,只爱吃青菜的话,那么唯一的办法就是全部倒掉,重新做一份青菜炒饭了。盖浇饭就没这么多麻烦,你只需要把上面的盖菜拨掉,更换一份盖菜即可了。盖浇饭的缺点是入味不均,可能没有蛋炒饭那么香。  到底是蛋炒饭好还是盖浇饭好呢?其实这类问题都很难回答,非要比个上下高低的话,就必须设定1个场景,否则只能说是各有所长。如果大家都不是美食家,没那么多讲究,那么从饭馆角度来讲的话,做盖浇饭显然比蛋炒饭更有优势,他可以组合出来任意多的组合,而且不会浪费。  盖浇饭的好处就是"菜""饭"分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是"可维护性"比较好,"饭"[]和"菜"的耦合度比较低。蛋炒饭将"蛋""饭"搅和在一起,想换"蛋""饭"中任何1种都很困难,耦合度很高,以至于"可维护性"比较差。软件工程追求的目标之一就是可维护性,可维护性主要表现在三个方面:可理解性、可测试性和可修改性。面向对象的好处之一就是显著的改善了软件系统的可维护性。  Via  更多其它的可以参考下面的链接,里面的文章写得都不错。  参考:  /wenda/thread?tid=3a8af1a399 a97786    /search?q=面向% E8��程+面向对��+优点+缺点&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:zh-CN:official&client=firefox-a  /baidu?wd=�����%B 3�+�������+�ŵ�+ȱ%B5�&tn=monline_dg    http://student.csdn.net/space.php?uid=2331&do=blog&id=2302  http://blog.csdn.net/wanghao72214/archive//3961250.aspx  http://blog.csdn.net/wanghao72214/archive//3933983.aspx最近打算给开发和QA的同学介绍一下面向对象和UML相关的内容。这是第一篇,介绍主要面向对象的基础概念和UML类图的绘制。类概念:类似对象的1种软件抽象,创建对象的模板。UML图:属性和操作之前可附加1个可见性修饰符。加号(+)表示具有公共可见性。减号(-)表示私有可见性。#号表示受保护的可见性。省略这些修饰符表示具有package(包)级别的可见性。如果属性或操作具有下划线,表明它是静态的。在操作中,可同时列出它接受的参数,以及返回类型。接口概念:定义了一套内聚行为的1个或多个操作特性标记的集合。接口是确保送耦合的1种强大的方法。它们允许类参与一套共同的功能集,除了支持接口意外,不需要别的类知道任何有关他的事情。接口的设计要遵循“接口分离原则”,参见什么是面相对象设计的SOLID原则(s)UML图:接口的UML图展现的样式会有几种变化,但内容都是一样的。注:在StarUML中可以通过选择Interface元素的Format-&【StereotypeDisplay】、【Suppress Attributes】、【Suppress Operations】来调整。联系(Association)概念:实体之间的1个结构化关系表明对象是相互连接的。箭头是可选的,它用于指定导航能力。如果没有箭头,暗示是1种双向的导航能力。UML图:聚合(Aggregation)概念:有时对象会有其他对象组成。例如,飞机由机身、机翼、引擎、起落架等组成。这些全部都是聚合这个概念的例子,它表示“ispart of”关系。UML图:class Node{
vector&Node*& itsN};
上述代码只有当子节点不会成为父节点的父节点时(即,必须是树结构,不能是图结构),才能称之为聚合。组合(Composition)
概念:组合是更强形式的聚合,其中“整体”负责部分,每个“部分”对象也仅与1个整体对象联系。例如,在任何给定时间,引擎是且仅是飞机的一部分。而且,除了飞机以外,其他对象都不能直接与引擎对象发生交互。
UML图:class Car{
virtual ~Car() {delete itsC}
Carburetor* itsCarb};依赖(Dependency)概念:对象之间存在临时关系,只有1个原因,它们可能会相互协作。1个对象与另1个对象进行协作,它需要了解这个对象。这意味着2个对象之间必须存在对象关系或part-of关系。当2个对象之间不存在持久关联之际,我们需要在2个类之间建立依赖。UML图:泛化(Generalization)概念:表示1个更泛化的元素和1个更具体的元素之间的关系。UML图:AbstractKmsTheme被标记为抽象的(名字是斜体)。实现(Realization)概念:指定2个实体之间的1个合同。换言之,1个实体定义1个合同,而另1个实体保证履行该合同。UML图总结面向对象的概念和术语汇总表术语描述Abstract Class抽象类不能实例化的类Abstraction抽象1个项目(可能是类或者操作)的本质特征Aggregation聚合2个类或者组件之间的关系,定义为“is part of”Association关联2个类或者对象之间的关系Attribute属性类了解的东西(数据/信息)Cardinality基数表示“有多少”的概念Class类类似对象的1种软件抽象,创建对象的模板Cohesion内聚封装单元(如组件或者类)的相关程度Component组件1种内聚功能单元,可以独立开发、发布、由其他组件编辑组成更大的单元。Composition组合强类型的聚合,其中“整体”完全负责各个组成部分,每个部分对象仅与1个“整体”对象相关联Concrete Class具体类可以从中实例化对象的类Coupling耦合2个项目之间的依赖程度Generalization泛化表示1个更泛化的元素和1个更具体的元素之间的关系。Inheritance继承定义为“is a”或者“is like”的关系Instance实例1个对象,它是某个类的1个示例Instantiate实例化从类定义中创建对象Interface接口定义了一套内聚行为的1个或多个操作特性标记的集合Message消息请求星系或者执行任务Messaging消息传递对象之间通过发送消息相互协作的过程Method方法有执行值操作的类实现的1个过程(与结构化编程中的函数相似)Multiple Inheritance多重继承直接继承自1个以上的类Object对象基于类定义的人物、地点、事件、事物等等Optionality选择性概念“你需要它吗?”Override在子类中重新定义属性和/或方法,以使它们与父类中的定义有区别Pattern在考虑相关因素的情况下,通用问题的1个可行性解决方案Polymorphism多态不同的对象可以以不同的方式响应同一消息,使对象可以交互而不需知道确切的类型Property在UML2中,是1个命名的值,例如,属性和关联,包括组合,指定元素(例如类或者组件)的1个特征。在Java中,属性的组合包括Getter和SetterSingle Inheritance多重继承仅从1个类直接继承Stereotype构造型建模元素的1种通用用法Subclass子类继承自另1个类的类Superclass父类另1个类从中继承的类篇二 : ABAP面向对象(ObjectOrientation)OO在程序中, 对象的识别和寻址是通过对象引用来实现的, 对象引用变量可以访问对象的属性和方法.ABAP 中的类也有程序内部的局域类和全局类之分, 其作用范围不同. ABAP中的全局类是通过ABAP工作台中的类创建工具Class Builder 开发的, 保存在系统类库程序 Class Pool 中, 可供所有程序作用.一. 程序中类的定义.1. 类声明及实现*ClassDeclarationsCLASSapplicationDEFINITION.PUBLICSECTION.METHODS:show_text.PRIVATESECTION.DATAtext(100)TYPEcVALUE'ThisismyfirstABAPObject.'.ENDCLASS.CLASSapplicationIMPLEMENTATION.METHODshow_text.WRITEtext.ENDMETHOD.ENDCLASS.2. 成员可见性.公有: 可被所有对象使用.PUBLIC SECTION.保护: 只能被本类及其派生类中的方法使用.PROTECTED SECTION.私有: 只能被类本身的方法所使用.PRIVATE SECTION.公有部分常常用来定义类的方法, 而类属性则一般定义为类的私有或保护数据, 只能通过自身或其派生类的方法来操作.3. 成员类型.可定义3种不同类型的成员, 分别是属性, 方法和事件.属性是在类内部的数据对象, 对于实例属性, 用 DATA 定义, 语法与数据对象声明相同;对于静态属性(类属性), 使用 CLASS-DATA 语句定义, 在类的声明部分定义.*ClassDeclarationsCLASSapplicationDEFINITION.PUBLICSECTION. CLASS-DATA class_name(10) type c value'Vehicle'. "静态属性PRIVATESECTION.DATAspeedTYPEi.ENDCLASS.对于公有组件还可以在属性定义语句中增加 READ-ONLY 关键字,则该属性不能被类外部读取但可被类的内部方法所修改.除 DATA 外, 也可以使用 CONSTANT 语句定义类常量,必须在类定义时指定其值.使用 TYPES 语句在类中定义的数据类型, 相当于静态属性, 其定义方法与普通 ABAP 程序类似.类方法需要在类的声明和实现两部分进行定义, 在类的声明部分说明方法的参数接口, 在实现部分则通过 ABAP代码完成具体的功能.方法的声明关键字为 METHODS 和 CLASS-METHODS.METHODS meth IMPORTING ... i1 TYPE ... EXPORTING ... e1 TYPE ... CHANGING ... c1 TYPE... EXCEPTIONS ... x1 TYPE ...定义了方法及方法的参数接口, 和 FORM 相似, 但没有 TABLES 参数.CLASSvehicleDEFINITION.PUBLICSECTION.CLASS-DATAclass_name(10)TYPEcVALUE'Vehicle'.METHODS:accelerate,show_speed.PRIVATESECTION.DATAspeedTYPEi.ENDCLASS.CLASSvehicleIMPLEMENTATION.METHODaccelerate.speed=speed+1.ENDMETHOD.METHODshow_speed.WRITE:/'Speed:',speed.ENDMETHOD.ENDCLASS.二. 定义系统全局类.通过 Class Builder 工具在类型为 K 的 ABAP 类库程序中定义. 如果在1个程序中使用该类,则整个类库将被载入到程序内存中.1. 全局类定义.可以用 SE80 或 SE24 进入 Class Builder 进行创建.使用全局类.REPORTz_af_049.DATA:ob_veh1TYPEREFTOz_cl_vehicle1.START-OF-SELECTION.CREATEOBJECTob_veh1.CALLMETHODob_veh1-&show_speed.三. 程序中的类实例.使用对象的步骤如下:1) 定义类的声明和实现方法;2) 使用 DATA 语句中的 TYPE REF TO 参照类类型声明引用变量;3) 使用 CREATE OBJECT 语句创建对象;4) 通过 -& 或 =& 运算符访问对象或类组件;1. 对象创建与引用;ABAP 对象的创建和访问需要通过对象引用进行, 引用类型是ABAP基本类型之一,其中包括数据引用和对象引用,其中对象引用又包括类引用和接口引用. 对于普通类来说, 应使用类引用.在程序中, 需要先根据对象类型声明引用类型变量, 然后对该变量引用ABAP对象,该引用变量中实际上存储的是ABAP对象的内在地址,因而该引用类型变量也就是普通意义上的指向对象的指针.1个引用类型变量可以不指向任何内存地址或指向1个数据对象,但1个ABAP对象则可以同时存在多个指向它的指针, 可以通过所有这些指针对其进行操作. DATA ob_vehicle TYPEREF TO vehicle. CREATE OBJECTob_vehicle.其中DATA语句创建了1个引用数据对象,该数据对象的类型定义为"指向1个类为vehicle的对象的指针".定义指针之后, CREATE OBJECT 语句则创建了1个类vehicle的实例,并同时将该对象的地址指针赋给引用类型ob_vehicle. 实际情况如下图所示:引用类型与其它类型的数据类型相同, 同类型变量之间也可以相互赋值, 成功赋值之后二者将指向相同的对象.2. 访问对象组件.对象创建之后, 可以通过指向它的指针(引用变量)对其进行操作. 可以使用的对象组件一般为当前可见的属性和方法,通过引用变量后接运算符 -& 访问对象组件. -&就可以以访问类中定义的实例组件又可以访问静态组件. 但对于静态组件还有另1种访问方式,通过类名称本身=&直接访问.oref-&comp其中oref代表引用变量, comp 代表类成员.class=&comp其中class代表类名.由于引用类型变量本身也可以被定义为类属性, 因而可以出现下述的链式访问结构:oref1-&oref2-&comp或者class=&oref-&comp上述的2种运算符是类的外部访问, 在某些情况下, 对象本身需知道本身的地址, 可以使用局部引用变量 ME,该变量隐式的存在于所有的实例方法中, 当方法被调用时, 该变量将包含自身的地址指针,这种用法称为对象的自身引用.3. 删除对象对象占据程序内存, 如果有后续程序中不再使用的对象, 应该将其删除, 系统对象的删除操作与引用变量有关,系统将自动定时进行检测, 如果1个对象不再被任何变量引用, 则将其删除, 并释放其所占的内存,这个操作是通过垃圾回收机制来完成的.垃圾回收机制定时的清除不再使用的对象, 使用 CLEAR 语句初始化所有指向该对象的引用变量或者将引用变量的值改变,都将触发回收机制.四. 方法.1. 参数的定义和传递.类方法的参数接口部分在在类声明部分通过METHODS语句定义的, 而且该接口不需要在类的实现部分再次出现,参数接口的详细语法形式为:
METHODS meth
IMPORTING ... [VALUE(i1)|i1] TYPE type [OPTIONAL|DEFAULT def1]...
EXPORTING ... [VALUE(e1)|e1] TYPE type [OPTIONAL] ...
... [VALUE(c1)|c1] TYPEtype [OPTIONAL|DEFAULT def1] ...
RETURNING VALUE(r)
EXCEPTIONS ... X1 ...2. 调用方法时, 除去指定为可选的参数之外, 所有的参数都必须传递相应的实参值.
CALL METHOD[oref-&|class=&]meth EXPORTING ...i1 = f1 ...
IMPORTING ... e1 = g1...
CHANGING ...c1 = c1 ...
EXCEPTIONS ... x1 = rc1 ...该语句格式适用于包括类内部直接调用,实例调用(oref-&)和静态调用(class=&)3种情况.其中参数定义时用IMPORTING选项指定的形参 i 此时将接受 CALL METHOD 语句中用EXPORTING 中传递的实参f; 而用 EXPORTING 选项指定的形参 e 此时将通过 IMPORTING 选项传递给实参 g.如果方法中[]只包含输入参数, 而没有输出参数, 则可以使用下列几种形式的简略形式对参数进行调用.CALL METHOD[oref-&|class=&]method().CALL METHOD[oref-&|class=&]method(f).CALL METHOD[oref-&|class=&|method(...i1 = f1...).Example:CLASSvehicleDEFINITION.PUBLICSECTION.CLASS-DATAclass_name(10)TYPEcVALUE'Vehicle'.METHODS:show_speed,accelerateimportingratetypei.PRIVATESECTION.DATAspeedTYPEi.ENDCLASS.CLASSvehicleIMPLEMENTATION.METHODaccelerate.speed=speed+rate.ENDMETHOD.METHODshow_speed.WRITE:/'Speed:',speed.ENDMETHOD.ENDCLASS.DATA:ob_vehTYPEREFTOvehicle.START-OF-SELECTION.CREATEOBJECTob_veh.callmethodob_veh-&accelerateexportingrate=2.callmethodob_veh-&accelerateexportingrate=2.callmethodob_veh-&show_speed.方法还可以进行动态调用, 即通过变量对方法名进行指定, 例如下列语句: meth = accelerate. CALL METHODob_veh-&(meth).实参的动态传递: CALL METHOD[oref-&|class=&]meth
PARAMETER-TABLEptab
EXCEPTION-TABLEetab.其中实参必须在程序中放置在2个特定类型的内表中, 传递给方法,其中参数表ptab可以参照类型组ABAP_PARMBID(行类型)和ABAP_PARMBIND_TAB(表类型)生成; 异常表etab可以参照ABAP_EXCBIND(行类型)和ABAP_EXCBIND_TAB(表类型)生成.3. 函数方法.函数也是1种过程模块, 其特殊之处是在调用时可以使用操作符(=)来替代过程调用语句, 并可作为操作数直接应用于操作语句中,因为函数只返回1个唯一的值. 在ABAP Objects 语法中, 可以用例如函数方法来实现这种函数功能, 形式如下:
METHODS meth
IMPORTING ... [ VALUE(i1)|i1] TYPE type [OPTIONAL|DEFAULT def1]...
RETURNING VALUE(r).1个函数方法可以有多个数量的输入参数, 但只能有1个输出参数, 且该输出参数必须为值传递而且需要完成限定其类型.函数方法的调用格式如下:CALL METHOD[oref-&|class=&]meth EXPORTING ... i1 = f1 ... RECEIVING
r = h.简化的调用形式如下:... [oref-&|class=&]method( )...... [oref-&|class=&]method(f)...... [oref-&|class=&]method(...i1 = f1 ...) ...CLASScircleDEFINITION.PUBLICSECTION.METHODSget_areaIMPORTINGvalue(i_radius)TYPEi
RETURNINGvalue(r_size)TYPEf.PRIVATESECTION.CONSTANTSpiTYPEfVALUE'3.1415926'.ENDCLASS.CLASScircleIMPLEMENTATION.METHODget_area.r_size=i_radius**2*pi.ENDMETHOD.ENDCLASS.DATA:ob_circleTYPEREFTOcircle,areaTYPEf.PARAMETERS:radiusTYPEi.START-OF-SELECTION.CALLMETHODob_circle-&get_areaEXPORTINGi_radius=radiusRECEIVINGr_size=area.WRITE:/area.area=ob_circle-&get_area(radius).WRITE:/area.4. 构造和析构方法.1). 构造方法是运行时环境自动调用的1种方法, 用于为对象设定1个初始化状态, 不能在程序运行过程中由程序代码调用.实例构造方法在每一次对象创建的过程中(CREATE OBJECT语句时)被系统调用, 如果在类声明部分进行声明,则需要在实现部分进行代码实现.METHODS constructor IMPORTING ... [VALUE(i1)|i1] TYPE type[OPTIONAL|DEFAULT def1] ... EXCEPTIONS ... e1 ...构造方法中不包含任何形式的输出参数, 其功能只是定义对象状态,而不是对其进行改变.类构造方法属于静态方法, 只在程序中被调用一次, 即第一次使用该类时调用, 该方法也必须在公有部分声明, 其名称必须为CLASS_CONSTRUCTOR.
CLASS-METHODSclass_constructor.类构造方法不包含接口, 而且在其中只能访问类的静态属性.REPORTz_af_049.*ClassDeclarationsCLASSvehicleDEFINITION.PUBLICSECTION.CLASS-DATAclass_name(10)TYPEcVALUE'Vehicle'.METHODS:show_speed,accelerateIMPORTINGrateTYPEi,constructorIMPORTINGi_speedTYPEi."构造函数PRIVATESECTION.DATAspeedTYPEivalue0.ENDCLASS.CLASSvehicleIMPLEMENTATION.METHODconstructor.speed=i_speed.ENDMETHOD.METHODaccelerate.speed=speed+rate.ENDMETHOD.METHODshow_speed.WRITE:/'Speed:',speed.ENDMETHOD.ENDCLASS.DATA:ob_vehTYPEREFTOvehicle.START-OF-SELECTION.CREATEOBJECTob_vehexportingi_speed=4."构造函数CALLMETHODob_veh-&show_speed.CALLMETHODob_veh-&accelerateEXPORTINGrate=2.CALLMETHODob_veh-&accelerateEXPORTINGrate=2.CALLMETHODob_veh-&show_speed.五. 继承ABAP 所有的类都是默认继承了系统中的空类 OBJECT.具有一般性的类称为基类(Superclass), 其各个子类称为派生类(Subclass).在类定义时, 使用 INHERTING FROM 附加项可以指定派生类和基类之间的继承关系.CLASS c2 DEFINITION INHERITING FROM c1. ...ENDCLASS.ABAP 中的继承为单一继承, 即1个类可以有多个派生类, 但只能有1个直接基类.在继承过程中各成员的组件可见性如下:因而, 继承类和基类的公有成员和被保护成员享有共同的命名空间, 而私有成员则在不同类之间可以出现重名情况.参照基类声明的引用变量可以指向其继承类的对象, 如上图所示, 对象 n 是类 Class3的1个实例, 而左侧的3个引用变量CREF1, CREF2, CREF3 则分别参数类 Class1, Class2, Class3 生成. 这3个类存在继承关系.参考基类声明的引用变量也可以指向其派生类, 即3个变量均可以指向对象 n, 但要注意的是 CREF1 只能访问 Class1的公有组件, 而 CREF2 可以访问 Class1 和 Class2的公有组件, CREF3则可以访问全部类的公有组件.但特别要注意的是: 尽管基类引用变量可以指向其继承类对象, 然而反之则被视为错误的类型转换.多态性的继承实现.在继承中, 多态性是通过方法重载及引用变量实现的, 即子类可以重新定义并以不同的方式实现基类中的公有或保护方法,此时基类中的方法需为实例方法.在派生类中要这样声明:METHOD meth REDEFINITION.该方法必须和基类中的方法具有相同的接口, 但可以通过不同的代码实现.在方法重载过程中, 如果在派生类内部仍然需要使用基类中的方法, 则可以使用 SUPER 关键字来指定其基类.CALL METHODsuper-&meth.Example:*&---------------------------------------------------------------------**&ReportZ_AF_050*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORTz_af_050.CLASSclass1DEFINITIONINHERITINGFROMobject."基类PUBLICSECTION.METHODS:accelerate,write_status.PROTECTEDSECTION.DATA:speedTYPEi.ENDCLASS.CLASSplaneDEFINITIONINHERITINGFROMclass1.PUBLICSECTION.METHODS:rise,write_statusREDEFINITION."多态PROTECTEDSECTION.DATAaltitudeTYPEi.ENDCLASS.CLASSshipDEFINITIONINHERITINGFROMclass1.PUBLICSECTION.METHODS:write_statusREDEFINITION."多态ENDCLASS.CLASSclass1IMPLEMENTATION.METHODaccelerate.speed=speed+1.ENDMETHOD.METHODwrite_status.WRITE:/'Speed:',speed.ENDMETHOD.ENDCLASS.CLASSplaneIMPLEMENTATION.METHODrise.altitude=altitude+2.ENDMETHOD.METHODwrite_status.WRITE:'Plane:'.CALLMETHODsuper-&write_status.WRITE:/'Altitude:',altitude.ENDMETHOD.ENDCLASS.CLASSshipIMPLEMENTATION.METHODwrite_status.WRITE:/'Shipspeed:',speed.ENDMETHOD.ENDCLASS.DATA:plane_refTYPEREFTOplane.DATA:ship_refTYPEREFTOship.START-OF-SELECTION.CREATEOBJECT:plane_ref,ship_ref.CALLMETHOD:plane_ref-&accelerate,plane_ref-&rise,plane_ref-&write_status,ship_ref-&accelerate,ship_ref-&write_status.抽象类和抽象方法.1个基类可能包含多个派生类, 但该基类只是作为模板出现的, 并不需要有任何对象作为实例,则可以将该类声明为抽象类(Abstract Class).CLASS class1 DEFINITION ABSTRACT....ENDCLASS.抽象类不能使用 CREATE OBJECT 语句创建类对象, 其主要目的是为了做派生类的模板,实际使用的对象则依照各个派生类创建.也可以将方法定义为抽象方法.METHODS meth ABSTRACT ...1个抽象方法不能在类本身中实现, 而必须在其派生出的非抽象类中实现. 因而含有抽象方法的类必须定义为抽象类.最终类和最终方法.最终类(Final Class), 是不能被继承的类, 其主要意义在于: 设计过程中, 如果1个类有很多级别的派生类,则其中公有和被保护成员方法, 随意改动该类, 很容易造成派生类中的语法和主义冲突. 因而, 如果不希望在程序中继续对该类进行派生,则可以定义该类为最终类.CLASS class1 DEFINITION FINAL....ENDCLASS.最终方法是不可以重新定义的方法, 不一定出现在最终类中, 但最终类中的所有方法都是最终方法.METHODS meth ABSTRACT ...六. 接口.1. 接口的定义与实现.Interfaces 就可以以保证这些类外部看起来具胡一致性,标准化的接口, 又可以在不同的类内部使用不同的实现方法,而这个具体实现过程是类外部的用户无需关心的.接口是1个独立结构, 可以在其中定义一些成员并在具体类中实现, 其作用是对类中已经定义的成员进行扩展.实现接口后,接口将成为类的公有成员, 但类可以自行对接口中的方法以其自身特定形式实现. 这样, 对于用户来说,不同的类对象包含相同的操作接口(即接口中定义的成员名称), 但程序内部的具体实现则根据类的不同而有所区别.接口是OOP中除继承之外的另1个主要多态性的实现机制技术.在程序中定义接口.INTERFACE intf. DATA ... CLASS-DATA ... METHOD ... ...ENDINTERFACE.在接口定义内部可以声明的成员与类中的成员相同, 但无需注明具体的可见性, 因为具体类中实现的所有接口组件均为公有成员.同时, 接口定义中也只包含成员声明部分, 而具体的实现也将在具体类中进行.实现接口.接口没有自己的实例, 因而也不需要进行方法实现,其中方法的实现要通过具体的类进行.语法格式如下:CLASS class1 DEFINITION. PUBLIC SECTION.
INTERFACES: int1,int2. ...ENDCLASS.在类定义中, 接口的实现只能出现在公有部分, 接口中定义的所有组件都将被添加为该类的公有成员.接口中的成员通过接口名称 + "~" + 成员方式访问.intf~comp.在类的实现部分, 必须包含所有的接口方法实现.CLASS class IMPLEMENTATION. ... METHOD intf1_imeth1.
... ENDMETHOD.
... METHOD intf2_imeth2.
... ENDMETHOD. ...ENDCLASS.1个接口可以被任意多个不同的类实现, 该接口中定义的成员集在各个类中名称相同(形成了1个标准接口),然而各个类中成员的方法的实现方式则可以有差异, 也就形成了多态性. 如果1个类中除接口之外没有定义任何类自身的公有成员方法,则接口就成了该类中的全部"外部接口".*&---------------------------------------------------------------------**&ReportZ_AF_051*&*&---------------------------------------------------------------------*REPORTz_af_051.INTERFACEstatus."DefineainterfaceMETHODSwrite.ENDINTERFACE.CLASScounterDEFINITION.PUBLICSECTION.INTERFACESstatus.METHODSincrement.PRIVATESECTION.DATAcountTYPEi.ENDCLASS.CLASScounterIMPLEMENTATION.METHODstatus~write."在接口的实现部分以stauts~write实现.WRITE:/'Countincounteris',count.ENDMETHOD.METHODincrement.ADD1TOcount.ENDMETHOD.ENDCLASS.CLASSbicycleDEFINITION.PUBLICSECTION.INTERFACESstatus.METHODSdrive.PRIVATESECTION.DATAspeedTYPEi.ENDCLASS.CLASSbicycleIMPLEMENTATION.METHODstatus~write.WRITE:/'Speedofbicycleis',speed.ENDMETHOD.METHODdrive.ADD10TOspeed.ENDMETHOD.ENDCLASS.DATA:countTYPEREFTOcounter,bikeTYPEREFTObicycle,statusTYPEREFTOstatus,status_tabTYPETABLEOFREFTOstatus.START-OF-SELECTION.CREATEOBJECT:count,bike.DO5TIMES.CALLMETHOD:count-&increment,bike-&drive.ENDDO.APPEND:countTOstatus_tab,bikeTOstatus_tab.LOOPATstatus_tabINTOstatus.CALLMETHODstatus-&write.ENDLOOP.该例中包含2个完全无关的类 bike 和 count, 但实现了相同的接口 status, 因而这2个类都包含同样的方法write, 该方法是在接口中定义的.接口引用.引用变量是访问 ABAP 对象的途径, 与基于类声明的引用变量类似, 也可以基于接口声明引用变量, 即接口引用.接口引用也是1种对象引用, 对于包含接口的类对象, 除通过类引用访问之外, 还可通过接口引用进行访问.接口引用可以指向任何实现了该接口的对象.YPTES|DATA iref TYPE REF TO intf.其中 intf 是全局或程序中已经定义的接口.通过接口引用访问对象.要访问1个类对象, 必须先声明1个基于该类的引用变量, 如果该类为1个接口的实现, 则可以将该车胎变量赋给1个接口变量,此时接口引用与类引用指向相同的类对象.假设接口变量名称为 inef, 类引用名称为 cref, 赋值语法格式如下:iref = cref.使用类引用访问:cref-&intf~attr.CALL METHOD cref-&intf~meth.使用接口引用访问属性和方法的语法格式如下:iref-&attr.CALL METHOD iref-&meth.对于接口中定义的静态成员, 如果该成员是常量, 则只能通过接口引用进行访问:intf=&const对于其他静态接口成员, 则可以通过实现该接口的类本身或者类引用进行访问:class=&intf~attr.CALL METHOD class=&intf~meth.在接口引用间赋值.与类引用类似, 可以将接口引用分配给不同的引用变量,还可以在类引用和接口引用之间相互赋值.假设存在类引用 cref 和接口引用iref, iref1 和 iref2.iref1 = iref2.系统将进行静态语法检查, 这2个接口必须参照同1个接口声明, 或者 iref2 所参照的接口是接口 iref1的1个成员.如果使用形式:iref = cref.则 cref 参照的类必须是 ABAP 预定义的空类 OBJECT.对于所有其他情况, 则必须通过强制赋值语句或者强制赋值运算符 "?="进行.MOVE iref to cref.cref ?= iref.在进行强制赋值时, 系统不会出现任何静态语法检查, 但系统将在运行时检查目标对象引用变量是否可以指向源变量引用的对象.如果允许则进行赋值, 否则将触发可以捕获的运行时错误 MOVE_CASE_ERROR.如果将接口引用赋给类引用, 且该类不是参照OBJECT声明,则必须使用强制赋值, 要使赋值过程成功, 接口引用iref所指向的对象中必须与类引用cref参照的类相同.七 事件.事件是除去属性, 方法之外的第3类成员. 这3种组件中, 属性用于刻画类对象的状态, 方法用于访问或修改对象状态,而事件则用于1个类对象发布其状态的改变, 因而其他对象可以捕获该方法并作出响应.在ABAP Object 中, 事件的触发和处理是通过特定的方法进行的, 1个方法作为触发者触发事件,而程序中的另1个方法则作为处理者捕获并处理该事件, 处理方法在事件出现进被执行.声名事件.事件可以在类或接口的声名部分进行声明.EVENTS|CLASS-EVENTS evt EXPORTING ... VALUE(e1) TYPE type[OPTIONAL] ...声明该事件时, 可以使用 EXPORTING 附加项指定需要向事件处理方法中传递的参数, 该参数传递方法恒为值传递.实例事件总是包含1个隐含的参数 SENDER, 该参数的类型为触发事件的类或接口的对象引用.触发事件.1个实例事件可以被类中的任意方法触发, 静态事件则可以被静态方法触发.RAISE EVENT evt EXPORTING ... e1 = f1 ...对于每1个没有被指定 OPTIONAL 项的形参 ei, 均必须在实例方法中传递1个实参 fi, 自身引用 ME对象在被默认的传递到隐含参数 SENDER.事件处理方法事件需要通过方法捕获事件并进行处理, 必须首先为该事件定义1个事件处理方法, 然后在运行时为该事件进行注册.声明事件处理方法任何类都可以为其它类中定义的事件进行处理, 同时也可以为自身事件进行处理.实例事件处理方法的语法格式如下:METHODS|CLASS-METHODS meth FOR EVENT evt OF cif IMPORTING ... ei...1个事件处理方法的接口中只能包含定义在事件 evt 中的形式参数, 并需遵循事件中的参数属性设定,但事件处理方法不需要使用所有 RAISE EVENT 中定义的参数.注册事件处理方法.要使事件处理方法能够对事件进行响应,必须在运行时为相关事件注册该方法, 语法格式如下:SET HANDLER ... hi ... [FOR] ...该语句将处理方法和相关的触发方法进行链接, 其语法和使用效果部分地取决于事件的类型.对于实例事件, 在进行处理之前必须在注册语句中使用附加项 FOR 指定希望注册到的对象.可以指定1个单独的对象作为事件触发者.SET HANDLER ... hi ... FOR ref.或者使用 FOR ALL INSTANCES 附加项为处理器注册所有可以触发该事件的实例;SET HANDLER ... hi ... FOR ALL INSTANCES.该注册过程可以作用于目前尚未被创建的实例.对于静态事件, 则不能使用 FOR 附加项;SET HANDLER ... hi ...该注册自动应用于整个类, 对于接口中的静态事件, 该注册可以应用于目前尚未装载至内在中的类.事件处理时间.在程序执行到 RAISE EVENT 语句之后, 所有已注册的处理方法都将在下1个语句之前被处理.如果处理方法本身触发事件, 则该处理方法在原方法继续执行之前被重新调用.事件的触发及处理.事件的触发和处理基本过程如下: 假设有2个类 C1 和 C2, C1中包含事件 E1, 而该事件可能在方法 M1 中通过RAISE EVENT 语句被触发, 而 C2 中将包含方法 M2, 该方法可以捕获事件 E1, 并进行处理.在实际操作时, 要使1个对象的事件处理方法能够捕获另1个对象触发事件, 必须先使用 SET HANDLER 语句进行注册,这个注册过程中形成了触发对象和响应对象之间的对应关系.当然, 也可以同时注册多个处理对象与1个触发对象相对应.SET HANDLER 语句则创建1个系统内部的事件处理表, 为每1个事件注册相应的方法. 该表为系统隐含. 对于实例事件,事件处理表中包含用于实现处理的方法名称以及注册了的类实例引用, 该表通过 SET HANDLER 语句动态的进行维护. 对于静态事件,系统为相关类创建1个实例无关的处理表. 一旦事件被触发, 系统将查找相关的事件表并执行对应于该事件的实例方法.*&---------------------------------------------------------------------**&ReportZ_AF_052*&*&---------------------------------------------------------------------*REPORTz_af_052.CLASSclass1DEFINITIONINHERITINGFROMobject.PUBLICSECTION.EVENTS:too_fast."声明事件,如果有参数恒为值传递METHODS:accelerate,show_speed.PROTECTEDSECTION.DATA:speedTYPEi.ENDCLASS.CLASSclass1IMPLEMENTATION.METHODaccelerate.speed=speed+1.IFspeed&5.RAISEEVENTtoo_fast."触发事件speed=5.ENDIF.ENDMETHOD.METHODshow_speed.WRITE:/'Speed:',speed.ENDMETHOD.ENDCLASS.*事件需要通过方法捕获事件并进行处理,必须首先为该事件定义*1个事件处理方法,然后在运行时为该事件进行注册.*声明事件处理方法,任何类都可以为其他类中定义的事件进行处理,*当然也可以为自身事件进行处理.CLASShandlerDEFINITION.PUBLICSECTION.METHODShandle_excessFOREVENTtoo_fastOFclass1.ENDCLASS.CLASShandlerIMPLEMENTATION.METHODhandle_excess.WRITE:/'Speedcannotbetoofast.'.ENDMETHOD.ENDCLASS.DATA:o_class1TYPEREFTOclass1,o_handleTYPEREFTOhandler.START-OF-SELECTION.CREATEOBJECT:o_class1,o_handle.*要使事件处理方法能够对事件进行响应,必须在运行时为相关事件注册该方法.SETHANDLERo_handle-&handle_excessFORALLINSTANCES.DO11TIMES.CALLMETHODo_class1-&accelerate.CALLMETHODo_class1-&show_speed.ENDDO.篇三 : 面向过程面向对象的区别面向对象和面向过程的区别面向过程1种以事件为中心的编程思想,以功能(行为)为导向,按模块化的设计,就是分析出解决问题所需要的步骤,然后用函数把这些步骤1步1步实现,使用之际1个1个依次调用即可了。面向对象1种以事物为中心的编程思想,以数据(属性)为导向,将具有相同1个或者多个属性的物体抽象为“类”,将他们包装起来;而有了这些数据(属性)之后,我们再考虑他们的行为(对这些属性进行什么样的操作),是把构成问题事务分解成各个对象,建立对象的目的不是为了完成1个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第1类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第3类对象(规则系统)来对棋局进行判定。可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯即可了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。举例2:又比如我们有一台演出,为简单起见,假设有如下流程:主持人开场——演员一表演——演员二表演——主持人总结。用面向过程的思想来分析,就是先完成主持人开场,再完成演员一的表演,再完成演员二的表演,最后完成主持人的总结。而如果用面向对象的思想来分析,就应该是这样的。这个演出由2大部分组成:主持人、演员。与主持人相关的:开场、总结。与演员相关的:演员编号、所演的节目。然后这台演出即可这样策划:需要1个主持人a,需要2个演员b、c。演出的事情可以表示为:a的开场——&b、c的编号和节目——& a的总结。什么是面向对象技术?面向对象技术是1种以对象为基础,以事件或消息来驱动对象执行处理的程序设计技术。它具有封装性、继承性及多态性。 传统的面向过程式编程语言是以过程为中心以算法为驱动的话,面向对象的编程语言则是以对象为中心以消息为驱动。面向对象技术有哪些优点?面向对象技术具有程序结构清晰,自动生成程序框架,实现简单,维护简单,代码重用率高,软件开发效率高等优点在中兴面试之际曾被问到C++和java有什么区别,当时答的一踏糊涂,现在也不知道,只是做个基本的总结吧C++和Java均支持面向对象技术的基本概念和基本特征,如封装、类、构造函数、析构函数、继承、多态等。C++与Java语法描述有相同之处,也有不同之处。如基本结构语句的语法大致相同,而类定义的语法等方面则不相同。1.指针JAVA语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了c/c++语言中指针操作失误,如野指针所造成的系统崩[)溃。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。C++通过构造函数创建对象,可以直接使用指针来操作对象的成员,而Java通过new运算符创建对象,通过new运算符返回的对象引用来使用对象,而不是直接操作指针;2.多重继承c++支持多重继承,这是c++的1个特征,它允许多父类派生1个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。Java不支持多重继承,但允许1个类实现多个接口(extends+implement),实现了c++多重继承的功能,又避免了c++中的多重继承实现方式带来的诸多不便。4.内存管理C++程序要显式地释放所分配的内存,而Java具有内存垃圾收集机制Java自动进行无用内存回收操作,不需要程序员进行删除。Java中当1个对象不被再用到时,无用内存回收器将给它加上标签以示删除。JAVA里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。而c十十中必须由程序贝释放内存资源,增加了程序设计者的负扔。5 操作符重载C++有运算符重载机制,而Java没有此特性;6 可移植性 java是运行在jvm上的,之所以说它的可移植性强,是因为jvm可以安装到任何的系统c++不是不能在其他系统运行,而是c++在不同的系统上运行,需要不同的编码(这一点不如java,只编写一次代码,到处运行)7.数据类型及类 Java是完全面向对象的语言,所有函数和变量部必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。 而C++是混合型面向对象程序设计语言,c++允许将函数和变量定义为全局的。此外,Java中取消了c/c++中的结构和联合,消除了不必要的麻烦。
上一篇文章:
下一篇文章:
本文标题:[面向对象面向过程区别]面向对象和面向过程的区别&版权说明
文章标题: 文章地址:
1、《[面向对象面向过程区别]面向对象和面向过程的区别》一文由262阅读网()网友提供,版权归原作者本人所有,转载请注明出处!
2、转载或引用本网内容必须是以新闻性或资料性公共免费信息为使用目的的合理、善意引用,不得对本网内容原意进行曲解、修改,同时必须保留本网注明的"稿件来源",并自负版权等法律责任。
3、对于不当转载或引用本网内容而引起的民事纷争、行政处理或其他损失,本网不承担责任。

我要回帖

更多关于 面向对象软件开发过程 的文章

 

随机推荐