二维码

[面向对象] ABAP类型转换Widening-casting和Narrowing-casting的区别

Twilight发表于 2015-10-27 16:57巽呆沐 最后回复于 2015-12-02 09:58 [复制链接] 6004 1

Narrowing-casting:UP-CASTING(扩展构造) 向上继承,说的是父类对象
向上类型转换(隐式/自动类型转换),子类到父类的转换
无风险,如将杯子中的水倒入壶中

Widening-casting:
Down-casting(缩小构造)向下继承,也就是强制性向下赋值类型,说的是子类对象
向下类型转换(强制类型转换),父类到子类的转换
有风险,如将壶中的水倒入杯子中,可能会有溢出的风险

这种转换只会出现在父类与子类的转换中。在OO里,类的继承是单向的,也就是子类继承父类,父类却不知道它的子类是哪一个。当子类继承父类之后,它就具有父类的所有属性,也可以访问父类里的所有组件(PUBLICK和protect, Private除外)。 子类继承父类之后,可以通过redefinition来修改父类中的方法,但是没有改变父类中的结构。

我们在系统里定义了一个Superclass: LCL_SUPERCLASS,它一个子类LCL_SUBCLASS并且CL_SUBCLASS继承了LCL_SUPERCLASS,子类的继承是通过INHERTING FROM来实现的。
  1. DATA: lo_superclass TYPE REF TO lcl_superclass,
  2.       lo_subclass   TYPE REF TO lcl_subclass,
  3.       lo_subclass01 LIKE lo_subclass.

  4. CREATE OBJECT lo_subclass.
复制代码

1、Narrowing-casting
  1. lo_superclass = lo_subclass.
复制代码
如果将子类参考分配给父类参考,则对于完成转型分配后在语法上进行访问的所有组件来说,可确保其在实例中使用。子类始终至少包含与父类相同的组件。
up-casting.jpg
从子类对象的“更多属性、方法”切换到父类对象“较少的属性、方法”,称为Narrowing-casting
通常我们把Super类看作树类结构的Top,而子类作为Down,所以子类到父类的转换也称为UP-CASTING,相反父类到子类的转换也可以称为Down-casting

2、Widening-casting
  1. DATA:lo_cast_error TYPE REF TO cx_sy_move_cast_error.

  2. TRY .
  3.     lo_subclass01 ?= lo_superclass.
  4.   CATCH cx_sy_move_cast_error INTO lo_cast_error.
  5.     WRITE: / 'Widening cast failed'.
  6. ENDTRY.
复制代码
向下转型分配操作符move...?to或其缩写形式?=。否则,你会收到一条消息,通知你在实例中应用转型分配后,无法确定所有组件都可以在语法上进行访问。通常,与父类相比,子类包含更多的组件。
down-casting.jpg
从父类对象的“较少的属性、方法”切换到子类对象“更多属性、方法”,称为Widening-casting

接口与类之间也有转型分配
接口转型.jpg

3、我们用一个例子来加深理解
  1. CLASS lcl_shape DEFINITION.
  2.   PUBLIC SECTION.
  3.     METHODS draw.
  4. ENDCLASS.

  5. CLASS lcl_shape IMPLEMENTATION.
  6.   METHOD draw.
  7.     WRITE :/ 'Drawing any Shape'.
  8.   ENDMETHOD.
  9. ENDCLASS.

  10. CLASS lcl_circle DEFINITION INHERITING FROM lcl_shape.
  11.   PUBLIC SECTION.
  12.     METHODS: draw REDEFINITION,
  13.              calc_area.
  14. ENDCLASS.

  15. CLASS lcl_circle IMPLEMENTATION.
  16.   METHOD draw.
  17.     WRITE :/ 'Drawing specific shape: Circle'.
  18.   ENDMETHOD.

  19.   METHOD calc_area.
  20.     WRITE :/ 'Area Of Crcle = 2iiR'.
  21.   ENDMETHOD.
  22. ENDCLASS.

  23. START-OF-SELECTION.
  24.   DATA : o_cir TYPE REF TO lcl_circle.

  25.   CREATE OBJECT o_cir.
  26.   CALL METHOD o_cir->draw( ). " calls subclass Draw() method
  27.   CALL METHOD o_cir->calc_area( ).

  28.   ULINE.
  29.   "——— Narrow cast(Upcast)—————"
  30.   DATA : o_shp TYPE REF TO lcl_shape.
  31.   o_shp = o_cir. "  Narrow cast(Upcast)
  32.   CALL METHOD o_shp->draw( ). " calls sub class Draw() method
  33.   "call METHOD o_shp->calc_area( ) . " compilation error

  34.   ULINE.
  35.   "———- Widening Cast(Downcast) ———–"
  36.   DATA : o_cir1 TYPE REF TO lcl_circle.
  37.   " o_cir1 = o_shp. "  complilation error
  38.   o_cir1 ?= o_shp.  " Widening Cast(Downcast)
  39.   CALL METHOD o_cir1->draw( ). " calls subclass Draw() method
  40.   CALL METHOD o_cir1->calc_area( ).
复制代码
执行结果
object-casting.jpg
子类到父类转换,变少了,不能计算面积,所以叫Narrowing Cast( Upcasting)
父类到子类的转换,变多了,能计算图形(圆)的面积,所以叫Widening Cast(Downcasting)
回复

使用道具 举报

巽呆沐
学习受教。。。       
回复 支持 反对

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表