BC404学习笔记-ABAP面向对象编程(三)-CAST 向上、向下转型问题.

1.向上、向下中的上下,可以理解成父类和子类。

2.向上转型(up-cast或者narrowing cast)指子类型引用实例化父类型对象,这样父类引用指向子类引用。这样之后父类的引用是访问不了子类的变量和方法的。用narrowing理解好点。

3.向下转型(down-cast或者widening cast) 父类型的引用来实例化子类型对象。这样之后子类型可以访问子类型所有方法,具体后面讲到。必须用 ?=或者move..?to.. (cast operator)

4.理解引用的静态类型和动态类型。每个引用类型(用ref to定义)都有静态和动态两个类型。 静态类型就是data定义的那个类型,动态类型是后面实际分配的类型。举个例子.

DATA: a type ref to lcl_airplane,

          b type ref to lcl_cargo_airplane.

create object b.

a = b.

这里lcl_airplane是父类,lcl_cargo_airplane是子类。那么a的静态类型就是一开始DATA定义的 ‘ref to lcl_airplane’. 

a = b 后,动态类型为‘ref to lcl_cargo_airplane’.就是说,引用的动态类型在程序运行过程中是可以更改的。


现在具体详细说明:

      向上转型 


up-cast之后,airplane只能访问name和weight,是不能访问cargo属性的。但是airplane的动态类型还是lcl_cargo_airplane。

     静态类型、动态类型



      向下转型

向下转型复杂点


这里为什么cargo_airplane2能访问所有属性,本质上还是因为它的静态类型决定的。定义的时候它就是lcl_cargo_airplane.另外,实际airplane是指向子类lcl_cargo_ariplane的实例的。即airplane的动态类型还是lcl_cargo_airplane。


   上面是能向上转型的情况,不能没有经过airplane = cargo_airplane 就直接 cargo_airplane2 ?= airplane.如

这样会产生 MOVE_CAST_ERROR运行间错误。你可以使用CATCH .....ENDCATCH捕捉这个错误。为什么会出错,airplane的动态类型还是lcl_airplane并没有指向子类实例(注意和前一个例子对比区别),你直接 ?= 根本就行不通。换句话说,芒果是水果,但是你说水果是芒果就不对了。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值