ABAP开发-面向对象开发_2
系列文章目录
文章目录
- 系列文章目录
- @[TOC](文章目录)
- 前言
- 接口和类
- 1、首先创建一个接口
- 2、在创建的接口的基础上创建一个类PERSON
- 3、创建子类STUDENT
- 4、创建子类TEACHER
- 5、SE38使用创建的类
- 总结
文章目录
- 系列文章目录
- @[TOC](文章目录)
- 前言
- 接口和类
- 1、首先创建一个接口
- 2、在创建的接口的基础上创建一个类PERSON
- 3、创建子类STUDENT
- 4、创建子类TEACHER
- 5、SE38使用创建的类
- 总结
前言
接口和类
全局类
SE24 创建一个接口-》创建一个实现接口的类-》再创建两个子类-》SE38 使用创建的类
1、首先创建一个接口
TCODE:SE24
定义属性,其中,级别:Instance Attribute–实例属性,Static Attribute–静态属性,Constant常量
定义方法
只定义方法还不够,若某方法需要传入参数传出参数等,则点击某方法,再点击”参数“,如下
若是设传入参数,则类型选IMPORTING;
另:Exporting传出参数,Changing改,Returning返回
同样的,GET_ID方法则需要返回一个值,也给他设置参数
填入参数,类型(类型就选Returning),关联类型
同样的,为set_name和get_name设置参数,如下
最后,检查-》激活-》保存
2、在创建的接口的基础上创建一个类PERSON
填写描述,取消勾选”最终“(若可能会被用到就不勾,若不会再被用到就勾上“最终”)
点击“接口”选择卡,填入我们上面创建的接口ZIF_YT36_PERSON_36130
回车,此时会带出来描述–人接口、属性、方法
可以看到,属性和方法都是pubilc公开的(因为是接口里面定义的,接口里面定义的都是可见的,因为接口里面的属性和方法就是要让被使用)
点击检查后,会有很多警告,是因为还没实现这些方法
此时,要实现各个方法,就要双击各方法,去编写程序
双击ZIF_YT36_PERSON_36130~SET_ID
method ZIF_YT36_PERSON_36130~SET_ID.
ZIF_YT36_PERSON_36130~ID = IV_ID."用传入的ID给接口属性赋值endmethod.
检查-》激活
再编写GET_ID方法,检查-》激活
method ZIF_YT36_PERSON_36130~GET_ID.RV_ID = ZIF_YT36_PERSON_36130~ID ."返回接口属性里的值endmethod.
同样的,编写SET_NAME,检查-》激活
method ZIF_YT36_PERSON_36130~SET_NAME.
ZIF_YT36_PERSON_36130~NAME = IV_NAME."传入的参数iv_name给接口赋值endmethod.
编写GET_NAME,检查-》激活
method ZIF_YT36_PERSON_36130~GET_NAME.RV_NAME = ZIF_YT36_PERSON_36130~NAME.endmethod.
再在类里加一个方法GET_FULL_NAME,此时,是可以选可见性的,而不是像在接口里的方法那样都是public
给该方法定义参数
填入参数、类型、关联类型
点击源代码,就可以进到实现该方法的程序里面,编写程序
method GET_FULL_NAME.RV_FULLNAME = ZIF_YT36_PERSON_36130~ID && ':' && ZIF_YT36_PERSON_36130~NAME.endmethod.
3、创建子类STUDENT
(1)
点击属性-》超类(SUPER CLASS)
填写超类,即创建的第一个类ZCL_YT36_PERSON_36130,保存
保存后就可以看到从父类继承过来的属性和方法,如下:
这时如果双击各个方法,就会弹出该方法是在父类中实施的
(2)
如果想在GET_FULL_NAME中实现一些student子类中的独特方法,则点击GET_FULL_NAME->再点击“重新定义方法”
method GET_FULL_NAME.
"先调父类里面的方法GET_FULL_NAME
CALL METHOD SUPER->GET_FULL_NAMERECEIVING"父类的方法有个return,所以用recive来接收RV_FULLNAME = RV_FULLNAME."第一个RV_FULLNAME 是父类里面的参数,第二个 RV_FULLNAME是这个方法里要返回的参数RV_FULLNAME = '学生' && RV_FULLNAME. endmethod.
然后检查-》激活
若不想要重定义的方法了,就点击该方法-》点击撤消重定义
(3)若想再在这个STUDENT类中加一些属于自己的属性和方法
属性:
方法:并设置参数
传入参数设好后,再点源代码
method SET_SCORE.SCORE = IV_SCORE."传入参数给该STUDENT类的属性SCORE赋值endmethod.
4、创建子类TEACHER
同样的,点击超类,输入类PERSON,保存
重定义GET_FULL_NAME
method GET_FULL_NAME.
CALL METHOD SUPER->GET_FULL_NAMERECEIVINGRV_FULLNAME = RV_FULLNAME.RV_FULLNAME = '老师' && RV_FULLNAME.endmethod.
添加属性–工资GONGZI
添加方法–SET_GONGZI,GET_GONGZI
`在这里插入代码片` method SET_GONGZI.
GONGZI = IV_GONGZI.endmethod.
method GET_GONGZI.RV_GONGZ = GONGZI.endmethod.
添加方法–GET_HOLIDAY
并添加参数,设一个返回值
添加源代码
method GET_HOLIDAY.RV_HOLIDAY = '教师节'.endmethod.
5、SE38使用创建的类
编写程序,点击模式
选择ABAP对象模式
填上实例,类/接口,方法,点击确定
则代码中就会自动出现一个模式,我们只需填入参数
同样的,调用GET方法
检查激活执行,执行结果如下:
除了点模式自动生成调用方法,也可以按如下语法来自己写(不用点模式)
*2、创建学生1
*要求创建学生
*调用SET ID/GET ID/SET_NAME/GET_FULLNAME/SET_SCORE/GET_SCORE ,可以向上面一样,点模式(call method),也可以不点模式,按如下语法写
*输出学生ID/FULLNAME/SCOREDATA: LO_STU1 TYPE REF TO zcl_yt36_STUDENT_36130.
CREATE OBJECT LO_STU1."实例化LO_STU1->ZIF_YT36_PERSON_36130~set_id( iv_id = 1 ).
DATA(LV_SID1) = LO_STU1->ZIF_YT36_PERSON_36130~Get_id( )."定义一个变量LV_SID1来接收返回值
WRITE: / '学生ID是:',LV_SID1.LO_STU1->ZIF_YT36_PERSON_36130~SET_NAME( IV_NAME = 'STU 1').
DATA(LV_STU_NAME1) = LO_STU1->GET_FULL_NAME( ).
WRITE: / '学生名字是:',LV_STU_NAME1.LO_STU1->SET_SCORE( IV_SCORE = 100 ).
WRITE: / '成绩:',LO_STU1->GET_SCORE( ).
另外,多态和接口
*3、多态
DATA: LO_PERSON3 TYPE REF TO ZCL_YT36_PERSON_36130."用父类定义一个对象
CREATE OBJECT LO_PERSON3 TYPE ZCL_YT36_TEACHER_36130."创建对象的时候,指定一个子类的类型
WRITE: / LO_PERSON3->GET_FULL_NAME( )."调用的是老师的FULL_NAME,因为创建对象的时候,指定的子类的类型是TEACHER
"多态:根据创建对象的类型不同,调用不同的方法实现DATA: LO_PERSON4 TYPE REF TO ZCL_YT36_PERSON_36130."用父类定义一个对象
CREATE OBJECT LO_PERSON4 TYPE ZCL_YT36_STUDENT_36130."创建对象的时候,指定一个子类的类型
WRITE: / LO_PERSON4->GET_FULL_NAME( )."调用的是学生的full_name,因为创建对象的时候,指定的子类的类型是STUDENT
"LO_PERSON4->GET_SCORE( )."因为我们用 ZCL_YT36_PERSON_36130定义的对象,所以没办法访问子类特殊的方法和属性
"不可以这样写,因为定义的时候ref to ZCL_YT36_PERSON_36130,PERSON里面有哪个方法,才可以调用哪个方法,person里没有GET_SCORE
"虽然创建对象的时候,指定的子类型是STUDENT,但是能调用哪些方法是由定义的时候REF TO来决定的
"而创建对象指定的子类型决定的是调用的方法具体走到哪个实现的类,53行*使用接口
DATA: LO_INTERFACE TYPE REF TO ZCL_YT36_PERSON_36130.
CREATE OBJECT LO_INTERFACE TYPE ZCL_YT36_STUDENT_36130.LO_INTERFACE->SET_NAME( IV_NAME = '接口调用' ).
WRITE: / LO_INTERFACE->GET_NAME( )."LO_INTERFACE->GET_FULL_NAME( )."因为LO_INTERFACE 是用接口定义的,这里面只能访问接口中包含的方法
执行结果如下: