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并没有指向子类实例(注意和前一个例子对比区别),你直接 ?= 根本就行不通。换句话说,芒果是水果,但是你说水果是芒果就不对了。