第一篇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 属性:
重新构建方法 show, 修改代码如下:
修改ZCL_APPLICATION_XX ,方法START需要将两个子类包含进来。
未完待续……。