abap oo

34
ABAP ABAP 面面面面面面 面面面面面面 . . 面面 面面 . . 面面面面 面面面面 . . 面面 面面 Control Control . ALV Control . ALV Control 面面 面面

Upload: vernoo

Post on 07-Nov-2014

2.645 views

Category:

Business


15 download

DESCRIPTION

abap oo

TRANSCRIPT

Page 1: Abap oo

ABAP ABAP 面向对象编程面向对象编程

一一 . . 介绍介绍二二 . . 主要概念主要概念三三 . . 使用使用 ControlControl四四 . ALV Control. ALV Control 例子例子

Page 2: Abap oo

一一 . . 介绍介绍 传统的传统的 ABAPABAP 面向过程编程面向过程编程

SAP AG 1999

Procedural Programming

DataData DataData

DataData DataData

DataData

Functions are defined independentlyof data structures

Direct access to data

FunctionFunction

FunctionFunctionFunctionFunctionFunctionFunction

FunctionFunctionFunctionFunctionFunctionFunctionFunctionFunction

Page 3: Abap oo

面向对象编程面向对象编程

SAP AG 1999

Object-Oriented Programming Model

DataMethod

Method

lcl_class

Attribute

Attribute

Method

Method

Class

Gives a general description of objects(“blueprint”)

Establishes status types (attributes) andbehavior (methods)

Object

Reflection of real world

Specific instance of a class

Page 4: Abap oo

SAP AG 1999

History of Programming Languages

Machine language

Assembler

Java

C++

ABAP Objects

ABAP

ABAP ObjectsABAP Objects 是是 ABAPABAP 的扩展,集合了的扩展,集合了 JavaJava ,, CC ++,++,SmalltalkSmalltalk 等语言的特点。和原来的等语言的特点。和原来的 ABAPABAP 无缝集成。无缝集成。

Page 5: Abap oo

ClassClass

在在 SAPSAP 中,可以在中,可以在 SE24SE24 或或 ABAPABAP 编辑器中定义编辑器中定义ClassClass 。二者的区别类似。二者的区别类似 SE11SE11 中定义的结构与中定义的结构与程序中定义的结构。程序中定义的结构。

在在 SE24SE24 中,可以看到类的各个部件,条理清楚。中,可以看到类的各个部件,条理清楚。代码中的关键字,如代码中的关键字,如 publicpublic ,, class-methodclass-method 等等在在 SE24SE24 中都可以体现出来。中都可以体现出来。

二二 . . 主要概念主要概念

Page 6: Abap oo

ClassClass :分两部分定义。:分两部分定义。 ClassClass 中不能再嵌套定义中不能再嵌套定义 ClassClass 。。

SAP AG 1999

CLASS <classname> DEFINITION.

ENDCLASS.

CLASS <classname> IMPLEMENTATION.

ENDCLASS.

The Class as a Blueprint for Objects

Definition partThe class components (forexample, attributes and methods)are defined in this part.

Definition partThe class components (forexample, attributes and methods)are defined in this part.

Implementation partThis part only contains the methodimplementations.

Implementation partThis part only contains the methodimplementations.

在在 ABAPABAP 编辑器中定义编辑器中定义 ClassClass

Page 7: Abap oo

定义定义 ClassClass 的一个例子的一个例子

Page 8: Abap oo

ObjectsObjects

ObjectObject :就是:就是 classclass 的实例(的实例( instancinstancee ))

使用使用 objectobject 前,先要用下面的语句来定义前,先要用下面的语句来定义该该 objectobject 属于哪个类属于哪个类data <object name> type ref to <class name>data <object name> type ref to <class name>

定义完该对象后,就可以使用定义完该对象后,就可以使用 create object create object

<object name><object name> 来创建对象了。这时系统会来创建对象了。这时系统会分配一块内存区域给对象。分配一块内存区域给对象。

Page 9: Abap oo

create objectcreate object 时,在内存中分配一个空间给该时,在内存中分配一个空间给该ObjectObject 。。

SAP AG 1999

Creating Objects: Syntax

DATA: airplane1 TYPE REF TO lcl_airplane, airplane2 TYPE REF TO lcl_airplane.

CREATE OBJECT airplane1. CREATE OBJECT airplane2.

CREATE OBJECT <reference>.

Main memory

airplane1

airplane2

name: weight: 0

name: weight: 0

Page 10: Abap oo

如果内存中某个如果内存中某个 objectobject 区域不被指向,系统将释放这部区域不被指向,系统将释放这部分内存。下图中对两个分内存。下图中对两个 objectobject 使用等号之后,它们指向使用等号之后,它们指向同一个内存地址,同时释放一个同一个内存地址,同时释放一个 objectobject 所占用的内存。所占用的内存。

SAP AG 1999

Garbage Collector

...DATA: airplane1 TYPE REF TO lcl_airplane, airplane2 TYPE REF TO lcl_airplane.

CREATE OBJECT airplane1 EXPORTING ... . CREATE OBJECT airplane2 EXPORTING ... .

airplane1 = airplane2.

Main memory

airplane1

airplane2

name: LH Bweight: 30,000 kg

name: AA Bostweight: 45,000 kg

Page 11: Abap oo

可以使用可以使用 TYPETYPE TABLE OF REF TO <class>TABLE OF REF TO <class> 关键字定义一个内表,关键字定义一个内表,来存放该类的多个对象。来存放该类的多个对象。

Page 12: Abap oo

可以是各种类型,包括:可以是各种类型,包括:

Data types: scalar (Data types: scalar ( 例如 例如 data element), data element), structured, in tablesstructured, in tables ,,

ABAP elementary types (C, I, ...)ABAP elementary types (C, I, ...) Object referencesObject references Interface referencesInterface references

AttributeAttribute

Page 13: Abap oo

按定义位置,分为按定义位置,分为 Public Public 和和 Private.Private.

Public AttributePublic Attribute :能从:能从 classclass 外直接访问和修外直接访问和修改。一般来说,尽量少定义改。一般来说,尽量少定义 Public AttributePublic Attribute 。。

Private AttributePrivate Attribute :只能从类中访问和修改。:只能从类中访问和修改。

Page 14: Abap oo

按定义的关键字,分为按定义的关键字,分为 Instance Instance 和和 Static.Static.

Instance AttributeInstance Attribute :同一个类中多个实例的:同一个类中多个实例的 Instance Instance AttributeAttribute 各自分开,具有不同的值。使用各自分开,具有不同的值。使用 DATADATA 关键字关键字定义。定义。

用法:用法:实例名实例名 ->-> 属性属性

Static AttributeStatic Attribute :同一个类中多个实例的:同一个类中多个实例的 Static Static AttributeAttribute 的值一样。可以通过各个实例或直接通过类来的值一样。可以通过各个实例或直接通过类来访问和修改。使用访问和修改。使用 CLASS-DATACLASS-DATA 定义。在定义。在 debugdebug 时可时可以看到以看到 class-dataclass-data 不占用不占用 objectobject 的内存。的内存。

用法:用法:实例名实例名 ->-> 属性属性 或 或 类名类名 =>=> 属性属性

Page 15: Abap oo

MethodMethod

按定义位置,分为按定义位置,分为 Public Public 和和 Private.Private. 类类似似 AttributeAttribute 。。

Public MethodPublic Method : 能从类外调用。: 能从类外调用。

Private MethodPrivate Method :只能从该类中调用。:只能从该类中调用。

Page 16: Abap oo

按定义的关键字,分为按定义的关键字,分为 InstanceInstance 和和Static.Static.

Instance MethodInstance Method :能使用:能使用 staticstatic 和和 instanceinstance 的内容。的内容。使用使用 MethodMethod 定义。定义。

用法:用法:实例名实例名 ->-> 方法名方法名

Static MethodStatic Method :只能使用:只能使用 staticstatic 的内容。可以不通过实的内容。可以不通过实例,直接调用。使用例,直接调用。使用 Class-MethodClass-Method 定义。定义。

用法:用法:实例名实例名 ->-> 方法名方法名 或 或 类名类名 =>=> 方法名方法名

Page 17: Abap oo

MethodMethod 的参数的参数 MethodMethod 的参数可以是的参数可以是 Class/ObjectClass/Object 可以有可以有 importing, exporting, importing, exporting,

changing, returningchanging, returning 等等

Page 18: Abap oo

ConstructorConstructor 方法(初始化)方法(初始化) 每个类都自动隐性带有名为每个类都自动隐性带有名为 constructor constructor

(( InstanceInstance )和)和 class_constructorclass_constructor (( StatiStaticc )方法。)方法。

要使用这两个要使用这两个 methodmethod ,必需首先定义它,必需首先定义它们。们。 constructorconstructor 可以有参数和例外,而可以有参数和例外,而class_constructorclass_constructor 没有参数。没有参数。

Page 19: Abap oo

每次使用每次使用 create objectcreate object 时自动执行时自动执行constructorconstructor 方法方法 ..

Class-constructorClass-constructor 在一个程序中只执行在一个程序中只执行一次。在以下事件前自动执行。一次。在以下事件前自动执行。

CREATE OBJECT CREATE OBJECT 调用该类的属性 调用该类的属性 使用使用 Call Method Call Method Registering a static event handler Registering a static event handler Registering an evetm handler method for a static Registering an evetm handler method for a static

event event

Page 20: Abap oo

如果如果 constructorconstructor 带有参数,在带有参数,在 create create objectobject 时就能够通过传入的参数初始化时就能够通过传入的参数初始化objectobject 。。

例如例如CREATE OBJECT airplane1 exporting CREATE OBJECT airplane1 exporting

p2_name = 'Hansemand' p2_name = 'Hansemand'

p2_planetype = 'Boing 747'. p2_planetype = 'Boing 747'.

Page 21: Abap oo

Protected Protected

protected sector protected sector 中的内容用可以被该类中的内容用可以被该类自己,其父类和子类访问。自己,其父类和子类访问。

Page 22: Abap oo

继承继承 可以有多级继承可以有多级继承 一个子类只有一个直接父类一个子类只有一个直接父类 类知道自己的类知道自己的 superclasssuperclass ,但不知道自己,但不知道自己

的的 subclasssubclass 继承时,继承时, superclasssuperclass 的内容不能除去,只的内容不能除去,只

能加入新的内容能加入新的内容 用法:定义用法:定义 classclass 时,使用关键字时,使用关键字

INHERITING FROMINHERITING FROM

Page 23: Abap oo

SAP AG 1999

CLASS lcl_airplane DEFINITION.

PUBLIC SECTION. METHODS get_name RETURNING VALUE(re_name) TYPE string.

PROTECTED SECTION. DATA tank TYPE REF TO lcl_tank. PRIVATE SECTION. DATA name TYPE string.

ENDCLASS.

lcl_airplane

# tank : lcl_tank

- name : string

+ get_name ( ) : string

+ public# protected- private

Inheritance and Visibility

Public components

Visible to all

Direct access

Protected components

Only visible within theirclass and within thesubclass

Private components

Only visible within the class

No access from outside theclass,not even from thesubclass

Page 24: Abap oo

InterfaceInterface

SAP AG 1999

Defining and Implementing an Interface

INTERFACE lif_document. DATA: author TYPE REF TO lcl_author. METHODS: print, display.ENDINTERFACE.

CLASS lcl_text_document DEFINITION. PUBLIC SECTION. INTERFACES lif_document. METHODS: display.ENDCLASS.

CLASS lcl_text_document IMPLEMENTATION. METHOD lif_document~print. ENDMETHOD. METHOD lif_document~display. ENDMETHOD. METHOD display. ENDMETHOD.ENDCLASS.

Interface only has adeclaration

An interfacecorresponds to anabstract class thatonly containsabstract methods

Interfaces areimplemented inclasses

Interfaces do nothave visibilitysections

Page 25: Abap oo

接口中只有定义。要完成的功能在接口中只有定义。要完成的功能在 classclass的的 implementationimplementation 部分实现。接口中的部分实现。接口中的部件自动在类中可用。部件自动在类中可用。

接口不分为接口不分为 publicpublic ,, privateprivate 等部分。等部分。 属性、方法、常量、类型等可以和类中的属性、方法、常量、类型等可以和类中的

一样定义一样定义 接口需要在类定义的接口需要在类定义的 publicpublic 部分列出。部分列出。 用法:用法:<interface name>~<component name> <interface name>~<component name>

Page 26: Abap oo

可以使用可以使用 TYPETYPE TABLE OF REF TO TABLE OF REF TO <interface><interface> 关键字定义一个内表,来存关键字定义一个内表,来存放属于不同类的对象。这些类必须都包含放属于不同类的对象。这些类必须都包含这个接口。这个接口。

Page 27: Abap oo

EventsEvents EventsEvents 类似一个类,有自己的属性和方类似一个类,有自己的属性和方

法,能被其它某一个类调用。法,能被其它某一个类调用。 EventEvent 只能有只能有 EXPORTING EXPORTING 参数参数 要使用要使用 EventsEvents ,需要以下几点。,需要以下几点。1.1. 在在 classclass 中定义中定义 eventsevents ,和它的触发条件(,和它的触发条件( eventsevents ,,

raiseraise ))2.2. 定义定义 eventsevents ,以及它实现的功能(,以及它实现的功能( method xxx for method xxx for

event of <class name>event of <class name> ))3.3. 使用包含使用包含 eventsevents 的的 objectobject 前,对前,对 eventevent 对象使用对象使用

create objectcreate object ,并且用,并且用 set handlerset handler 语句,使语句,使 eventevent能够被响应。能够被响应。

Page 28: Abap oo

三三 . . 使用使用 ControlControl (控件)(控件) 在对屏幕的编程中,常常使用在对屏幕的编程中,常常使用 ControlControl 技技

术,能够实现如术,能够实现如 VCVC ,, JavaJava 等语言的一些等语言的一些功能,如功能,如 EventEvent ,, AttributeAttribute 等。方便用等。方便用户和系统交互。户和系统交互。

常见的常见的 ControlControl ::TextEditTextEdit ,, ALVALV ,, PicturePicture ,, HTML HTML viewerviewer 等等

Page 29: Abap oo

使用使用 ControlControl 前,我们要先在屏幕上创建前,我们要先在屏幕上创建一个一个 ContainerContainer 控件。控件。 ControlControl 在这个控在这个控件中显示、处理。件中显示、处理。

做一个做一个 RichText RichText 控件的例子控件的例子1. 1. 创建控件创建控件

Page 30: Abap oo
Page 31: Abap oo

创建完创建完 containercontainer 后,就可以在程序中,后,就可以在程序中,调用系统自带的调用系统自带的 classclass 了。这里需要用到了。这里需要用到两个两个 class:class:cl_gui_custom_container cl_gui_custom_container

cl_gui_textedit cl_gui_textedit

创建创建 objectobject 的时候,传入的时候,传入 containercontainer 的名的名字做参数,并传入是否自动换行等参数字做参数,并传入是否自动换行等参数(这些参数,是传到(这些参数,是传到 constructorconstructor 方法方法的)的)

Page 32: Abap oo

效果如图,可以看到是一个空白的控件,并自带效果如图,可以看到是一个空白的控件,并自带了一些按钮。控件的大小和位置与了一些按钮。控件的大小和位置与 containercontainer 一一致。致。

Page 33: Abap oo

2. 2. 使用使用 cl_gui_texteditcl_gui_textedit 的其它功能的其它功能 可以调用该类中的方法,如可以调用该类中的方法,如

SET_FOCUSSET_FOCUS ,, GET_VISIBLEGET_VISIBLE 等,来完成其它等,来完成其它面向语言中的一些常见功能。面向语言中的一些常见功能。

通过类中的通过类中的 eventevent ,可以实现和用户的交,可以实现和用户的交互。可以自己定义互。可以自己定义 handlerhandler ,来响应用户,来响应用户的的 eventsevents 。。

Page 34: Abap oo

由于操作由于操作 controlcontrol 的方法都是通过的方法都是通过 RFCRFC 函函数传到数传到 front-endfront-end 实现的,因此要使用实现的,因此要使用FLUSHFLUSH 方法来保持方法来保持 front-endfront-end 和后台的同和后台的同步。步。写法:写法: CALL METHOD cl_gui_cfw=>flush.CALL METHOD cl_gui_cfw=>flush.