理论教育 面向对象的成员属性和方法

面向对象的成员属性和方法

时间:2023-06-12 理论教育 版权反馈
【摘要】:属性属性是在类内部的数据对象,用于描述类的状态。析构方法在某些面向对象语言中还存在析构方法的概念,该方法在对象删除过程中被调用,目前ABAP对象中尚未提供该方法的实现形式。事件用于一个类对象发布其状态的改变,因而其他对象可以捕获该方法并做出响应。1)触发器和处理事件在ABAP对象

面向对象的成员属性和方法

在类中能够使用TYPE语句来定义自己的ABAP数据类型,类型不是实例相关的,对类中的所有对象只存在一次。

1.成员类型

ABAP中可以定义三种不同的成员类型,分别是属性、方法和事件,各成员的可见性以及生存周期在类定义的同时被确定。

(1)属性

属性是在类内部的数据对象,用于描述类的状态。属性可以由多个数据类型组成,对象的说明由属性内容定义。一种类型的属性是关联变量,它允许建立和定位对象。关联变量能够在类内部定义,也允许从类中访问对象。

实例属性

实例属性的内容定义了专用实例,可以用DATA语句声明。

静态属性

静态属性的内容定义了类的声明,对类的所有实例有效。静态属性对每个类存在一次,可以用CLASS-DATA语句来声明它们,它们在类的全部运行时间都可以被访问。

常量

常量是特殊的静态属性,在声明时设置值,然后就不能再修改。声明使用CONSTANTS语句。

(2)方法

方法是对象行为的实现部分,可以将其视为是类中的过程,用于访问或修改对象状态。方法的定义和参数接口与函数模块相同,可以在声明部定义。

语法:978-7-111-50126-8-Chapter01-7.jpg

然后在执行部实现,语法如下。

语法:978-7-111-50126-8-Chapter01-8.jpg

本地数据类型和方法的定义与其他ABAP程序相同,可以用语句CALL METHOD来调用。

语法:978-7-111-50126-8-Chapter01-9.jpg

参数解释:

■Importing:指定一个或多个输入参数。

■Exporting:指定一个或多个输出参数。

■Changing:指定一个或多个输入/输出参数。

■Value:指定参数传递形式,分为值传递和引用传递两种形式。默认为引用传递,如果使用Value选项则为值传递。

■Type:指定参数类型,每一个参数都必须有指定的类型。

■Optional:指定该参数为可选时,程序将使用该参数类型的初始值进行传递,或者是使用Default选项后指定的默认值。

■Returning:该选项可以替代Importing和Exporting。

实例方法

可以用METHODS语句声明实例方法,它们可以访问类中的所有属性,能够触发所有的事件。

静态方法

可以使用CLASS-METHODS语句声明静态方法,它们只能够访问静态属性和触发静态事件。

构造方法(类构建器)

同普通方法一样,可以通过CALL METHOD调用,当建立一个对象(CONSTRUCTOR)或第一次访问类的部件时(CLASS_CONSTRUCTOR),有两个叫CONSTRUCTOR和CLASS_CONSTRUCTOR的专用方法能够自动被调用。

(1)构造方法

■构造方法是运行时环境自动调用的一种方法,用于为对象设定一个初始化状态,不能在程序运行过程中由程序代码调用。与其他方法类似,构造方法也存在静态和实例两种形式。

■构造方法不一定需要在类中定义,系统通常会自动生成一个默认的构造方法,将对象状态设置为初始值。

■构造方法中不包含任何形式的输出参数,其功能只是定义对象状态,而不是对其进行改变。

■构造方法在Create Object语句中被调用,根据实例构造方法的定义,该语句本身也可以包含输出参数Exporting和异常返回值Exceptions选项。

■类构造方法属于静态方法,只能在程序中被调用一次,即第一次使用该类时被调用,该方法也必须在公有部分声明,其名称必须为Class_Constructor。

■类构造方法不包含接口,而且在其中只能访问类的静态属性。

(2)析构方法

在某些面向对象语言中还存在析构方法的概念,该方法在对象删除过程中被调用,目前ABAP对象中尚未提供该方法的实现形式。

每个类都有一个隐含的方法,在Java或C++中叫构造函数;在一般语言中,构造函数和类名相同,但是在ABAP中,有一个保留的名字,叫做Constructor。当调用语句Create Object创建对象的时候,这个函数会被执行

构造函数Constructor可以分为实例Constructor以及静态Constructor。对于实例Constructor(声明的时候使用Methods),可以有Import参数以及Exceptions,而静态Constructor(声明的时候使用Class-Methods),没有参数传递。

注意:静态构造函数一定会在以下动作之前执行。

■创建对象,Create Object。

■访问静态属性,Class=>Attribute。

■调用静态方法,Call Method_Class=>Method。

■注册一个静态事件句柄。

(3)事件

用于一个类对象发布其状态的改变,因而其他对象可以捕获该方法并做出响应。方法是类的内部处理过程,定义了一个对象的行为。它可以访问所有类的属性,也可以修改对象的数据内容,还可以有一个参数接口,用户可以通过带参数调用,接收返回值。私有属性只能通过方法类修改。

对象或者类能够在其他对象或类中通过事件来触发事件处理的方法。在一个一般的方法调用中,一个方法可以被许多用户调用。当一个事件被触发,一系列事件处理方法可以被调用。在运行之前,触发器和处理方法之间的联系没有被建立。在一般的方法调用中,调用的Program决定了它希望调用的方法,这些方法必须存在。根据事件,处理方法确定它希望响应的事件。对所有的事件不需要注册处理方法。

类的事件可以在类的方法中通过使用RAISE EVENT语句触发。可以通过使用字句FOR EVENT<evt>OF<class>声明同一个或不同的类的方法作为一个事件处理的方法。

事件有一个与方法相似的参数接口,但是只有输出参数时这些参数通过触发器(RAISE EVENT语句)传递给事件处理方法,它把它们作为输入参数接收。

触发器和处理方法之间的联系通过SET HANDLER语句动态建立。触发器和处理方法可以是对象或类,这取决于使用的是实例还是静态事件或静态处理方法。当一个事件被触发,相关事件处理方法在所有注册的处理类中执行。

实例事件

可以用EVENTS语句声明实例事件。一个实例事件只能在实例方法中被触发。

静态事件

可以用CLASS-EVENTS语句声明静态事件,所有的方法(静态或实例)都可以触发静态事件。静态事件是只能在静态方法中被触发的事件类型。

1)触发器和处理事件

在ABAP对象中,触发器和处理一个事件意味着特定的方法作为触发器和触发事件执行。对于其他方法的相应处理器,这意味着当事件触发时处理方法被执行。

在ABAP对象中处理事件有以下两种方法。

■在声明部声明事件。

■使用它的一个方法触发事件。

事件声明

声明实例事件语法如下所示。

语法:978-7-111-50126-8-Chapter01-10.jpg

声明静态事件语法如下所示。

语法:978-7-111-50126-8-Chapter01-11.jpg(www.daowen.com)

两个语句都有同样的语法,EXPORTING字句用于指定传递给事件处理的参数。参数一般是值传递。实例事件一般包含默认参数SENDER,它具有与事件声明的接口或类型相关的类型。

触发事件

实例事件可以被类中的所有方法触发,静态事件可以被静态方法触发。

语法:978-7-111-50126-8-Chapter01-12.jpg

对每个没有被定义为正式参数的<ei>,必须在EXPORTING字句中传递一个相应的实际参数<fi>。自定义的ME自动被传递给默认参数SENDER。

2)事件处理

事件处理使用指定的方法,处理事件方法的要求有以下两个。

■被定义成为事件的事件处理方法。

■在执行时为事件注册。

事件处理方法的声明

所有的类可以包含针对其他类事件的处理方法。当然,也可以在同一个类中定义处理方法。实例方法的声明语句如下。

语法:978-7-111-50126-8-Chapter01-13.jpg

静态方法使用CLASS-METHODS来代替METHODS。<evt>是在类或接口中的一个事件声明。

一个处理方法的接口只能包含在事件<evt>声明中定义的正式参数中。参数属性也由事件使用。处理方法不一定需要使用RAISE EVENT语句所传递的所有参数,如果希望使用默认参数SENDER,必须在接口中包含。这个参数允许一个实例事件处理访问触发器,例如,允许它返回结果。

一旦在类中定义了事件处理方法,这意味着类的实例或类本身在理论上能够处理在一个方法中触发的事件<evt>。

注册事件处理方法

为一个事件处理方法响应事件,必须在运行触发器时确定哪个用于响应。通过以下语句实现。

语法:978-7-111-50126-8-Chapter01-14.jpg

它将处理方法清单和相应的触发方法联系起来。事件有四个不同的方法:

■在类中声明的实例事件。

■在接口中声明的实例事件。

■在类中声明的静态事件。

■在接口中声明的静态事件。

针对以上四种情况,SET HANDLER语句语法和作用是不同的。

对于实例事件,可以使用FOR字句来指定实例需要注册的处理。也可以指定一单个实例作为触发器,使用关联变量<ref>。

语法:978-7-111-50126-8-Chapter01-15.jpg

或者可以为所有能够触发事件的实例注册处理方法。

语法:978-7-111-50126-8-Chapter01-16.jpg

然后,注册器为在注册处理时还没有建立的触发实例提供事件。可以使用FOR字句定义静态事件。

语法:978-7-111-50126-8-Chapter01-17.jpg

注册器自动提供给整个类,或者给所有实现含静态事件接口的类。对于接口,注册器还应用于那些在动态运行中直到处理程序的类。

3)事件处理的生命期

在RAISE EVENT后,所有注册的处理方法在下一个语句处理之前被执行(同步事件处理)。如果一个处理方法自己触发事件,则它的处理方法在初始处理方法之前。为避免无穷的递归,事件处理一般只嵌套64层。

处理方法根据它们被定义的顺序执行,一旦事件处理被动态注册,则不能认为它们在特定的顺序执行,相反,必须认为所有的事件处理会同步执行。

注:在ABAP中,接口需要另外实施(其实就是在类中实施),同时又独立于类。在接口中只有声明部分,而没有具体的实施部分。

■接口必须在类的公共部分列出(Public Section)。

■接口中的操作在类中实现,并且作为类的方法;所有接口中的方法必须在类的实现部分实施。

■在接口中定义的属性、事件、常量、类型等在声明它的类中自动可见。

■实施接口的方法:Interface~Component Name。

2.成员的可见性

成员的可见性是基于封装原则确定的。

(1)PUBLIC SECTION

公有部分定义的类成员可以被所有对象使用,包括类方法及其派生类中定义的方法。这些组件构成了类的外界接口部分。

(2)PROTECTED SECTION

保护部分中定义的类成员只能被类及其派生类中的方法使用,外部不可见,这些组件连同公有组件构成了类和派生类对象之间的接口。在4.5B中,继承是无效的,所以Protected范围与Private相同。

(3)PRIVATE SECTION

类成员只能被类本身的方法使用。

注:

公有属性(Public Attributes)定义在Public Section中,其内容可以在类的外部看到或者修改。尽量减少公共属性,其原因可以参考面向对象语言的特性—封装。尽可能在类的内部修改属性,留给外部的只有接口,避免外部直接操作类里面的属性(或称数据)。

只能在类的内部访问或者修改的数据,定义在Private Section里面。

在类中,每个静态属性都是唯一的。属性的值在所有类的实例中是相同的。用class-data声明。

保护属性(Protected Attributes)定义在Protected Section里面,其作用是更改区域里面的属性或者方法,不能被外部调用,但是在它的子类中是可见的。也就是说,其子类可以访问Protected Section中的数据,这和Private Section是不同的。

Public Method、Private Method、Static Method、Protected Method及其对应的属性同上。

1)使用对象的一般步骤

●定义类的声明与方法实现。

●使用DATA语句中的TYPE REF TO选项参照类类型声明引用变量。

●使用CREAT OBJECT语句创建对象。

●通过->或=>运算符访问对象或类组件。

2)访问对象组件

对象是ABAP程序所获得内存空间里的一个类的实例。首先在DATA声明里用TYPE REF TO<类>声明ABAP数据类型,然后用CREATE OBJECT创建类的实例。也可以用MOVE对兼容的对象之间赋值,以后就可以使用。

3)访问内容语法格式

●一个对象的实例属性或静态属性oref->attr。

●类的静态属性class=>attr。

●在类内部访问自身实例属性或静态属性me->attr或attr。

●对象的实例属性或静态方法CALL METHOD oref->meth。

●类的静态方法CALL METHOD class=>meth。

●在类内部访问自身实例方法或静态方法CALL METHOD me->attr或CALL METHOD attr。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈