现在的位置: 首页 > 综合 > 正文

【OO】深入理解ABAP Object Step by Step (二)

2013年10月03日 ⁄ 综合 ⁄ 共 4395字 ⁄ 字号 评论关闭

第一篇step by step 整理的是如何创建类,并生成类的对象来调用类的方法,这一边着重理解类与类的关系。

1,继承。

类所具有的特征:

A.类是可以被继承

B.所有类都是从一个OBJECT的类继承下来的

C.如果一个类没有明确表示继承于某个类,那它就是从OBJECT类继承下来的.

D. 每个类都只能继承于一个类,所以从最底层的类到OBJECT类只可能有一条线路.C3-C2-C1-OBJECT。

类继承的实现语句:
CLASS superclass DEFINITION.
……..
ENDCLASS.
CLASS superclass IMPLEMENTATION.
…….
ENDCLASS.
CLASS subclass DEFINITION INHERITING FROM superclass.
………
ENDCLASS.
CLASS subclass IMPLEMENTATION.
………
ENDCLASS.

注意:

A.SUBCLASS类采纳了SUPERCLASS类的PUBLIC/PROTECT组件;
B.PRIVATE组件是不可继承的.如图:

继承类能够在继承的方法基础上对方法做重定义(REDEFINITION):

CLASS的定义中 (DEFINITION):
METHOD meth REDEFINITION.
CLASS的实施中 (IMPLEMETATION):
METHOD meth.
….. “重写方法内容
ENDMETHOD.

抽象类:

a.一个抽象类不能被实例化,它只是继承它的类的一个模板.
b.可以直接访问抽象类的静态组件CALL METHOD  cl_supber=>demo1
c.只要有抽象方法存在,这个类也会被自动看做抽象类.下边就是一个很好的例子.
d.抽象方法不能在主类中实现,只能通过它的继承类来实现,并且必须加上重定义标志’REDEFINITION’。

抽象方法
CLASS cl_super DEFINITION.
PUBLIC SECTION.
METHODS: demo1
ABSTRACT,
demo2.
ENDCLASS.
重定义该方法
CLASS cl_sub DEFINITION
INHERITING FROM cl_super.
PUBLIC SECTION.
METHODS demo1
REDEFINITION.
ENDCLASS.

最终类及方法(FINAL CLASS):

A.最终类不能再被继承
B.一个最终类的所有方法也都被视为最终的,不需要在方法中再声明FINAL.
C.最终方法不会被重定义(非最终类的情况下,可以在继承类出现).
D.在保护一个类或者避免方法被重新设定的时候可以才用FINAL关键字.
E.一个最终方法不能是抽象方法.
F.一个最终类可以是抽象类,但这种情况下只能使用它的静态组件,不能实例化.

CLASS final_class DEFINITION FINAL.
. . . . . . . .
ENDCLASS.
CLASS derived_class DEFINITION
INHERITING FROM final_class .
. .. . . . . . . .
ENDCLASS.

CLASS super_class DEFINITION .
. . . . . . . .
METHODS final_method FINAL.
ENDCLASS.

CLASS sub_class DEFINITION
INHERITING FROM super_class .
. .. . . . . . . .
METHODS final_method
redefinition.

ENDCLASS.

继承中的静态组件:

A.主类的PUBLIC和PROTECT 静态组件能被继承类使用。

B.PUBLIC STACTIC组件(属性+方法)能够被它的继承类(可以是继承类的继承类,无限延伸)用选择符’=>’的方式使用。例如:

CLASS base_class DEFINITION.
PUBLIC SECTION.
CLASS-DATA : name TYPE STRING
VALUE
‘ABAP’.
………..
ENDCLASS.
CLASS derived_class DEFINITION
INHERITING FROM base_class.
. .. . . . . . . .
ENDCLASS.
START-OF-SELECTION.
base_class=>name.
derived_class=>name.

继承中的构造方法:

A,就像所有的PUBLIC和PROTECT组件,继承类会继承父类的实例化构造方法。

B,当一个继承类创建它的对象的时候,他继承的实例化属性和父类的私有属性都必须被初始化。

C,父类的私有属性不会被子类使用,所以子类不能够完全初始化父类的属性,为了初始化父类,必须采用DEFINITION的方式对构造方法重新定义。

CLASS base_class DEFINITION.
PUBLIC SECTION.
METHODS: constructor IMPORTING arg1 TYPE
STRING.
PRIVATE SECTION.
DATA: fld TYPE STRING.
. . . . . . . .
ENDCLASS.

CLASS derived_class DEFINITION INHERITING FROM
base_class .
PUBLIC SECTION.
METHODS: constructor IMPORTING arg1 TYPE STRING

arg2 TYPE STRING.

PRIVATE SECTION.
DATA: fld TYPE STRING.
. . . . . . . .
ENDCLASS.
CLASS derived_class IMPLEMENTATION .
METHODS constructor.
CALL METHOD SUPER->constructor
EXPORTING arg1 = arg1.
fld = arg2 .

………
ENDMETHOD.
ENDCLASS.

静态的构造方法:

a.静态的构造方法定义方式和实例化的构造方法很形似.

b.当一个静态构造方法被重定义的时候不需要加REDEFINITION语句

c.没有参数的接口存在于静态构造方法中。

d. ABAP的运行环境会确保静态构造方法正确被调用,所以你不必在重载的静态方法中对主类的静态方法做调用。

父类的静态构造方法:

CLASS base_class DEFINITION.
PUBLIC SECTION.
METHODS: class_constructor.
PRIVATE SECTION.
DATA: fld TYPE STRING.
. . . . . . . .
ENDCLASS.

子类的静态构造方法:

CLASS derived_class DEFINITION
INHERITING FROM base_class .
PUBLIC SECTION.
METHODS: class_constructor .
PRIVATE SECTION.
DATA: fld TYPE STRING.
. . . . . . . .
ENDCLASS.

不用调用父类的构造方法:

CLASS derived_class IMPLEMENTATION .
METHODS class_constructor.
fld = ‘ I am sub’ .
………
ENDMETHOD.
ENDCLASS.

继承的对象引用:

引用参数之间的赋值:

a.当一个引用参数赋值给另一个引用参数的时候,我们要考虑对象的定义内容是否能够通过语法的CHECK。

b.当目标参数对应的静态类型级别高于源参数对应的静态类型时候,我们称之为”Narrowing Cast”,这种情况是肯定能通过语法检查的.

c.当目标参数对应的静态类型低于源参数对应的静态类型时候,我们称之为”Widening Cast”.在这种情况下, 如果采用”=“操作符,在语法检查的时候会报错,所以我们使用’?=’操作符来让这种情况能够通过语法检查,而在执行的时候做异常捕获.

DATA : oref1 TYPE REF TO object,
oref2 TYPE REF TO class.

oref1 = oref2.         Narrowing Cast

oref2 = oref1.         Syntax error occurred

oref2 ?= oref1.        Widening Cast。

 

CATCH SYSTEM-EXCEPTIONS
MOVE_CAST_ERROR = 4.
oref2 ?= oref1.
ENDCATCH.

 2,多态(Polymorphism)

引用参数的静态类型为一个父类,它也能够再被动态的引用给一个子类,我们知道子类可以继承父类的PUBLIC和PROTECT方法,同时它也能重载方法来实现,正是这样,才能实现语言的多态,也就是一个对象的方法调用,能实现不同的操作.多态意味着使用同样的接口却实现了不同的操作,这是依靠继承的功能和动态的引用来实现的。

CLASS super_class DEFINITION.
. . . . . . . . . .
METHODS test_method.
ENDCLASS.
CLASS sub_class_one DEFINITION
INHERITING FROM super_class.
. . . . . . . . .
METHODS test_method
REDEFINTION.
ENDCLASS.
CLASS sub_class_two DEFINITION
INHERITING FROM super_class.
. . . . . . . . .
METHODS test_method
REDEFINTION.
ENDCLASS.

静态的定义

DATA: supr_obj type ref to super_class,
sub1_obj type ref to sub_class_one,
sub2_obj type ref to sub_class_two.
START-OF-SELECTION.

CREATE OBJECT sub1_obj.
CREATE OBJECT sub2_obj.

动态的引用方式

supr_obj = sub1_obj.
CALL METHOD supr_obj->test_method.
supr_obj = sub2_obj.
CALL METHOD supr_obj->test_method.

示例:

继续上一篇的例子,针对ZCL_VEHICLE_XX. 创建一个子类, ZCL_TRUCK_XX。这个子类会有一个静态的 constructor 设置最大速度为100,同时会redefine 方法 SHOW.

创建一个子类:

构建 类 truck 自己的 constructor:

重新实例化方法show ;点击 redefine 按钮。

修改代码:

再创建一个 subclass ZCL_SHIP_XX, 该subclass拥有一个静态 constructor 设定最大速度为30 并且有个传入参数并设定属性为只读用来作为船的名字。

添加一个name 的 public 属性:

重新构建constructor
, 并添加代码。

重新构建方法
show, 修改代码如下:
修改ZCL_APPLICATION_XX
,方法START需要将两个子类包含进来。

F8 执行:
 

未完待续……。

抱歉!评论已关闭.