ABAP CLASS父类子类转换

理解ABAPOO对象中的UP-CASTING和DOWN-CASTING
 

在ABAP OO对象中,会经常提到UP-CASTING和Down-casting.那么这究竟是什么呢?

UP-CASTING: 向上继承

Down-casting:向下继承,也就是强制性向下赋值类型;

比如:

我们在系统里定义了一个Superclass: LCL_SUPERCLASS,它一个子类LCL_SUBCLASS并且CL_SUBCLASS继承了LCL_SUPERCLASS.

子类的继承是通过INHERTING FROM来实现的。

Data: lo_superclass type ref to LCL_SUPERCLASS,

        lo_subclass  TYPE REF TO LCL_SUBCLASS,

        lo_subclass01  LIKE lo_subclass.

 

CREATE OBJECT lo_subclass.

lo_superclass = lo_subclass. “这就是up-casting ,也就是widen casting,那么将子类的reference赋值给superclass的reference,那么superclass的就可能获取到更多的component,因为包括一部分subclass里的组件;

使用UP-casting,这样就确定双方的component基本上保持一致,包括名字和组件。

up-casting只能使用SUPERCLASS中重定义的组件和继承的组件。

 

lo_subclass01 ?= lo_superclass.  ”这就是down-casting,也就是narrow casting,因为lo_superclass赋值给lo_subclass01,无法确定sub_class01的类型,必须使用 "?="来强制类型转换,否则会出现message.

down-casting可以使用SUPERCLASS中重定义的组件和继承的组件,以及subclass中新增的组件。

 

其实这些都是由类的继承关系可以解释的。在OO里,类的继承是单向的,也就是子类继承父类,父类却不知道它的子类是哪一个。当子类继承父类之后,它就具有父类的所有属性,也可以访问父类里的所有组件(PUBLICK和protect, Private除外)。

 子类继承父类之后,可以通过redefinition来修改父类中的方法,但是没有改线父类中的结构。

<think>嗯,用户想了解ABAP父类子类的继承关系和使用方法。这个问题在面向对象编程中很基础但也很关键,用户可能是刚开始接触ABAP OO开发,需要清晰的示例说明。 从引用内容看,ABAP的继承机制有几个重要特点:所有类都隐式继承自OBJECT类,只支持单继承,子类能继承父类的public和protected成员,并可以通过redefinition改写方法。这些在回答中都需要重点强调。 用户似乎更关注实际用法而非理论,所以考虑准备用具体场景来演示。选择"交通工具"作为父类很合适,因为汽车/飞机作为子类的继承关系直观。需要特别注意ABAP特有的语法细节,比如INHERITING FROM必须大写,REDEFINITION关键字的位置等。 在构造示例时,准备展示三个层次:1) 父类定义通用属性和方法 2) 子类继承并添加特殊属性 3) 方法改写。特别注意在子类构造函数中调用父类构造函数的写法,这是ABAP容易出错的地方。 关于引用标注,准备在讲解继承限制时引用[1][2],在说明类定义语法时引用[3],在介绍ABAP OO发展背景时引用[4]。这些引用要自然地融入行文,避免打断阅读。 最后考虑设计的问题需要覆盖实际开发痛点:为什么用继承替代接口?如何选择protected作用域?这些能帮助用户深化理解。性能优化的问题则针对ABAP特有的内存管理机制。</think>在ABAP面向对象编程中,**继承**是实现代码复用和层次化设计的关键机制。以下是父类子类关系的核心要点及使用方法: --- ### 一、继承关系核心规则 1. **隐式继承** 所有类均隐式继承自根类 `OBJECT`(一个空的抽象类)[^1][^4]。 2. **单继承限制** ABAP仅支持**单继承**(一个子类只能有一个直接父类)[^1][^3]。 3. **成员可见性** 子类自动继承父类的 `PUBLIC` 和 `PROTECTED` 属性和方法,但无法访问 `PRIVATE` 成员[^1][^2]。 --- ### 二、关键语法与用法 #### 1. 定义父类 ```abap CLASS lcl_vehicle DEFINITION. "父类:交通工具 PUBLIC SECTION. METHODS: drive. PROTECTED SECTION. DATA: speed TYPE i. ENDCLASS. ``` #### 2. 子类继承父类 ```abap CLASS lcl_car DEFINITION INHERITING FROM lcl_vehicle. "子类:汽车 PUBLIC SECTION. METHODS: drive REDEFINITION, "重写父类方法 honk. "扩展新方法 PRIVATE SECTION. DATA: fuel TYPE i. ENDCLASS. ``` - 使用 `INHERITING FROM` 指定父类[^3] - 通过 `REDEFINITION` 重写父类方法(需保持相同接口)[^1] #### 3. 子类实现重写方法 ```abap CLASS lcl_car IMPLEMENTATION. METHOD drive. speed = 100. "可访问父类PROTECTED属性 WRITE: / 'Car driving at', speed, 'km/h'. ENDMETHOD. METHOD honk. WRITE: / 'Beep beep!'. ENDMETHOD. ENDCLASS. ``` --- ### 三、使用场景示例 ```abap DATA: lo_vehicle TYPE REF TO lcl_vehicle, lo_car TYPE REF TO lcl_car. CREATE OBJECT lo_car. lo_car->drive( ). "输出: Car driving at 100 km/h lo_car->honk( ). "输出: Beep beep! "多态应用 lo_vehicle = lo_car. "父类引用指向子类对象 lo_vehicle->drive( ). "仍调用子类重写的方法 ``` --- ### 四、继承中的关键约束 1. **构造函数调用** 子类构造函数必须通过 `super->constructor` 显式调用父类构造函数[^2]: ```abap METHOD constructor. super->constructor( ). "必须调用 fuel = 50. ENDMETHOD. ``` 2. **最终类/方法** 使用 `FINAL` 禁止继承或重写: ```abap CLASS lcl_secret DEFINITION FINAL. "禁止继承 METHODS final_method FINAL. "禁止重写 ENDCLASS. ``` 3. **抽象类** 用 `ABSTRACT` 定义仅用于继承的基类: ```abap CLASS lcl_abstract DEFINITION ABSTRACT. METHODS abstract_method ABSTRACT. ENDCLASS. ``` > 提示:优先使用组合而非深度继承层次,避免过度耦合[^2][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值