ABAP中之枚举对象。ABAP中之枚举对象。

by admin on 2018年10月5日

 

 

枚举对象是枚举类型的数目对象。枚举对象只能分包类型也枚举类型的枚举值。ABAP从本7.51初始支持其。

枚举对象是枚举类型的数据对象。枚举对象只能分包类型为枚举类型的枚举值。ABAP从本7.51开头支持她。

就是一律栽普遍的模式。在ABAP 7.51事先,人们一般用如下方式贯彻类似的机能:

立刻是一模一样种普遍的模式。在ABAP 7.51之前,人们亚洲必赢手机日常用如下方式实现类似的功能:

CLASS cx_wrong_size DEFINITION INHERITING FROM cx_static_check.
 ENDCLASS.

 CLASS shirt DEFINITION.
   PUBLIC SECTION.
     TYPES tsize TYPE i.
     CONSTANTS:
       size_s  TYPE tsize VALUE 0,
       size_m  TYPE tsize VALUE 1,
       size_l  TYPE tsize VALUE 2,
       size_xl TYPE tsize VALUE 3.
     METHODS
       constructor IMPORTING size TYPE tsize
                   RAISING   cx_wrong_size.
     ...
   PRIVATE SECTION.
     DATA
       size TYPE tsize.
 ENDCLASS.

 CLASS shirt IMPLEMENTATION.
   METHOD constructor.
     IF size <> size_s AND
        size <> size_m AND
        size <> size_l AND
        size <> size_xl.
       RAISE EXCEPTION TYPE cx_wrong_size.
     ENDIF.
     me->size = COND #(
       WHEN size <> size_s AND
                    size <> size_m AND
                    size <> size_l AND
                    size <> size_xl THEN THROW cx_wrong_size( )
       ELSE size ).
   ENDMETHOD.
 ENDCLASS.
CLASS cx_wrong_size DEFINITION INHERITING FROM cx_static_check.
 ENDCLASS.

 CLASS shirt DEFINITION.
   PUBLIC SECTION.
     TYPES tsize TYPE i.
     CONSTANTS:
       size_s  TYPE tsize VALUE 0,
       size_m  TYPE tsize VALUE 1,
       size_l  TYPE tsize VALUE 2,
       size_xl TYPE tsize VALUE 3.
     METHODS
       constructor IMPORTING size TYPE tsize
                   RAISING   cx_wrong_size.
     ...
   PRIVATE SECTION.
     DATA
       size TYPE tsize.
 ENDCLASS.

 CLASS shirt IMPLEMENTATION.
   METHOD constructor.
     IF size <> size_s AND
        size <> size_m AND
        size <> size_l AND
        size <> size_xl.
       RAISE EXCEPTION TYPE cx_wrong_size.
     ENDIF.
     me->size = COND #(
       WHEN size <> size_s AND
                    size <> size_m AND
                    size <> size_l AND
                    size <> size_xl THEN THROW cx_wrong_size( )
       ELSE size ).
   ENDMETHOD.
 ENDCLASS.

此地,size属性只可是shirt类中定义之常量中的价。其它值会导致大。用户创建shirt类时,需要如此做:

这边,size属性只堪是shirt类中定义的常量中之价值。其它值会导致大。用户创建shirt类时,需要这么做:

TRY.
    DATA(shirt) = NEW shirt( shirt=>size_xl ).
  CATCH cx_wrong_size.
    ...
ENDTRY.
TRY.
    DATA(shirt) = NEW shirt( shirt=>size_xl ).
  CATCH cx_wrong_size.
    ...
ENDTRY.

观出了啊?为什么非深受运行时环境来吧而做值检查为?有一样种植名叫枚举和枚举类型的定义(可以以这种状态下利用)。

探望出了啊?为什么非受运行时环境来吧而做值检查吗?有同样种植叫做枚举和枚举类型的概念(可以当这种状况下利用)。

在7.51跟再强的本子里,ABAP也会支撑枚举概念。如果应用枚举类型来再次写点的例证的口舌:

在7.51同更胜的本里,ABAP也会见支撑枚举概念。如果以枚举类型来再次写点的例子的话语:

CLASS shirt DEFINITION.
  PUBLIC SECTION.
    TYPES:
      BEGIN OF ENUM tsize,
        size_s,
        size_m,
        size_l,
        size_xl,
      END OF ENUM tsize.
    METHODS
      constructor IMPORTING size TYPE tsize.
    ...
  PRIVATE SECTION.
    DATA
      size TYPE tsize.
ENDCLASS.

CLASS shirt IMPLEMENTATION.
  METHOD constructor.
    me->size = size.
  ENDMETHOD.
ENDCLASS.
CLASS shirt DEFINITION.
  PUBLIC SECTION.
    TYPES:
      BEGIN OF ENUM tsize,
        size_s,
        size_m,
        size_l,
        size_xl,
      END OF ENUM tsize.
    METHODS
      constructor IMPORTING size TYPE tsize.
    ...
  PRIVATE SECTION.
    DATA
      size TYPE tsize.
ENDCLASS.

CLASS shirt IMPLEMENTATION.
  METHOD constructor.
    me->size = size.
  ENDMETHOD.
ENDCLASS.

TYPES语句的一个初变式:BEGIN OF ENUMEND OF
ENUM
,它好绕起一个常量的会师。常量的科班基本型是i再就是枚举值从0开始计数。

TYPES语句的一个初变式:BEGIN OF ENUMEND OF
ENUM
,它可以围绕起一个常量的集。常量的正式基本型是i而枚举值从0开始计数。

比如上文那样使的言辞:

譬如上文那样以的说话:

DATA(shirt) = NEW shirt( shirt=>size_xl ).
DATA(shirt) = NEW shirt( shirt=>size_xl ).

但,使用了枚举对象后,你不再要处理非常了。如果您传递一个非法值的口舌,会取得语法错误!

可是,使用了枚举对象后,你不再需要处理好了。如果你传递一个非法值的讲话,会获取语法错误!

DATA(shirt) = NEW shirt( 333 ).
DATA(shirt) = NEW shirt( 333 ).

亚洲必赢手机 1

亚洲必赢手机 2

 

 

枚举是种和常量的混合体。通过BEGIN OF ENUM enum – END OF ENUM
enum

你声明了一个可以在TYPE附加项后声称的中心类型enum。在其中间,你可声明一个常量集,它们叫做枚举常量。这样尽管定义了有enum品类的枚举对象所许的枚举值。在此间,TYPES事实上即便跟CONSTANTS讲话一样。

枚举是项目以及常量的混合体。通过BEGIN OF ENUM enum – END OF ENUM
enum

你声明了一个得以TYPE附加项后宣称的主干型enum。在她中,你得声明一个常量集,它们叫做枚举常量。这样虽定义了拥有enum种类的枚举对象所兴的枚举值。在这边,TYPES实在就与CONSTANTS话一样。

ABAP运行时环境会检查只有为允许的枚举值可以于予以给枚举对象。

ABAP运行时环境会检讨只有被允许的枚举值可以叫授予给枚举对象。

TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA size TYPE tsize.
size = size_xl. "允许

DATA dobj LIKE size.
dobj = size. "允许

dobj = 333. "语法或运行时错误
TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA size TYPE tsize.
size = size_xl. "允许

DATA dobj LIKE size.
dobj = size. "允许

dobj = 333. "语法或运行时错误

枚举对象只能赋值给有同样枚举类型的枚举对象。同样,枚举对象中的比较呢不得不以一如既往档次的枚举对象中发生。当然,枚举常量本身为饱含在内。

枚举对象只能赋值给持有同等枚举类型的枚举对象。同样,枚举对象中的于也只好于平类别的枚举对象中发生。当然,枚举常量本身也含有在内。

一般性,你或多或少啊未关心枚举对象的始末。枚举对象的语义由枚举常量来定义。然而,你也可用枚举类型定义为i类型之外的其余基本类型,并且拥有别样枚举值(其中一个须要是初始值):

平常,你或多或少也未关心枚举对象的内容。枚举对象的语义由枚举常量来定义。然而,你呢足以拿枚举类型定义为i类型之外的其它基本类型,并且有所别样枚举值(其中一个务必是初始值):

TYPES:
  basetype TYPE c LENGTH 2,
  BEGIN OF ENUM tsize BASE TYPE basetype,
    size_i  VALUE IS INITIAL,
    size_s  VALUE `S`,
    size_m  VALUE `M`,
    size_l  VALUE `L`,
    size_xl VALUE `XL`,
  END OF ENUM tsize.

DATA size TYPE tsize.
size = size_xl. "允许

DATA dobj LIKE size.
dobj = size."允许
TYPES:
  basetype TYPE c LENGTH 2,
  BEGIN OF ENUM tsize BASE TYPE basetype,
    size_i  VALUE IS INITIAL,
    size_s  VALUE `S`,
    size_m  VALUE `M`,
    size_l  VALUE `L`,
    size_xl VALUE `XL`,
  END OF ENUM tsize.

DATA size TYPE tsize.
size = size_xl. "允许

DATA dobj LIKE size.
dobj = size."允许

随即要是您得轻松地拿现有“枚举值”转换为新章程的枚举值。运气好的语句,可以无欲调其的动。

旋即要是您得轻松地管现有“枚举值”转换为新措施的枚举值。运气好的讲话,可以无需要调整其的采用。

而您以一个上下文中来超常一个枚举类型,你可以依次枚举值组织及组织里:

一经您以一个上下文中发出越一个枚举类型,你可以用逐一枚举值组织及组织里:

TYPES:
  BEGIN OF ENUM tsize STRUCTURE size,
    s,
    m,
    l,
    xl,
  END OF ENUM tsize STRUCTURE size.

DATA dobj TYPE tsize.
dobj = size-xl. "允许
TYPES:
  BEGIN OF ENUM tsize STRUCTURE size,
    s,
    m,
    l,
    xl,
  END OF ENUM tsize STRUCTURE size.

DATA dobj TYPE tsize.
dobj = size-xl. "允许

上述代码定义了一个枚举结构size。结构的机件是枚举类型的枚举常量。

上述代码定义了一个枚举结构size。结构的零部件是枚举类型的枚举常量。

 

 

枚举对象的普遍用处是较它与枚举常量以控制程序用切换至哪一个效应分:

枚举对象的大用处是较它与枚举常量以控制程序需要切换至啦一个功能分:

TYPES:
  BEGIN OF ENUM tsize STRUCTURE size,
    s,
    m,
    l,
    xl,
  END OF ENUM tsize STRUCTURE size.

DATA dobj TYPE tsize.

...

CASE dobj.
  WHEN size-s.
    ...
  WHEN size-m.
    ...
  WHEN size-l.
    ...
  WHEN size-xl.
    ...
ENDCASE.
TYPES:
  BEGIN OF ENUM tsize STRUCTURE size,
    s,
    m,
    l,
    xl,
  END OF ENUM tsize STRUCTURE size.

DATA dobj TYPE tsize.

...

CASE dobj.
  WHEN size-s.
    ...
  WHEN size-m.
    ...
  WHEN size-l.
    ...
  WHEN size-xl.
    ...
ENDCASE.

 除此之外,还有一些足动用的景:

 除此之外,还有有方可以的状况:

卿可以用枚举对象与给一个c路或者string型的公文。结果就是是概念了枚举值的枚举常量的名。

而可拿枚举对象给予给一个c项目或者string品种的文件。结果虽是概念了枚举值的枚举常量的名字。

TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA text TYPE string.
text = size_xl.
cl_demo_output=>display( text ). "结果是SIZE_XL
TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA text TYPE string.
text = size_xl.
cl_demo_output=>display( text ). "结果是SIZE_XL

为得以做:

为得以创作:

DATA(text) = CONV string( size_xl ).
DATA(text) = CONV string( size_xl ).

足以CONV操作符指定项目来访问当前值:

可以下CONV操作符指定项目来访问当前值:

TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA(value) = CONV i( size_xl ) .
cl_demo_output=>display( value ). "输出结果是3
TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA(value) = CONV i( size_xl ) .
cl_demo_output=>display( value ). "输出结果是3

其余一样种植方法是,可以使用CONV用一个立竿见影的枚举值转换为枚举对象(常规的赋值语句是无能为力形成的):

任何一样栽办法是,可以动用CONV将一个使得之枚举值转换为枚举对象(常规的赋值语句是无能为力到位的):

TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA(num) = 3.

TRY.
    DATA(dobj) = CONV tsize( num ) .
    cl_demo_output=>display( dobj ). "Output is SIZE_XL
  CATCH cx_sy_conversion_no_enum_value.
    ...
ENDTRY.
TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA(num) = 3.

TRY.
    DATA(dobj) = CONV tsize( num ) .
    cl_demo_output=>display( dobj ). "Output is SIZE_XL
  CATCH cx_sy_conversion_no_enum_value.
    ...
ENDTRY.

RTTI被为大多了一个遥相呼应的好像CL_ABAP_ENUMDESCR

RTTI中吗大半了一个相应的近乎CL_ABAP_ENUMDESCR

TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA(size) = VALUE tsize( ).

DATA(enum_descr) = CAST cl_abap_enumdescr(
  cl_abap_typedescr=>describe_by_data( size ) ).

cl_demo_output=>new(
  )->write_data( enum_descr->kind            "E, for elementary
  )->write_data( enum_descr->type_kind       "k, new for enumerated type
  )->write_data( enum_descr->base_type_kind  "I, the base type
  )->write_data( enum_descr->members         "Table of constants and values
  )->display( ).
TYPES:
  BEGIN OF ENUM tsize,
    size_s,
    size_m,
    size_l,
    size_xl,
  END OF ENUM tsize.

DATA(size) = VALUE tsize( ).

DATA(enum_descr) = CAST cl_abap_enumdescr(
  cl_abap_typedescr=>describe_by_data( size ) ).

cl_demo_output=>new(
  )->write_data( enum_descr->kind            "E, for elementary
  )->write_data( enum_descr->type_kind       "k, new for enumerated type
  )->write_data( enum_descr->base_type_kind  "I, the base type
  )->write_data( enum_descr->members         "Table of constants and values
  )->display( ).

多就是这些内容了。

基本上就是这些情节了。

卧下让ABAP运行时来呢您办事吧。要小心枚举类型只能在少数适合的演算位置被出现,并且只能分包预先规定的价。非法的枚举值永远不会见以枚举对象吃出现。

卧下为ABAP运行时来啊汝工作吧。要专注枚举类型只能于一些适合的演算位置被出现,并且只能分包预先规定的价值。非法的枚举值永远不会见在枚举对象中起。

 

 

PS:原文的评价中有人涉嫌,枚举值和多少字典中之domain的固定值很像,为什么双方没有并轨关系?

PS:原文的评头品足着有人干,枚举值和数码字典中的domain的固定值很像,为什么双方没有并轨关系?

笔者的回答是:这个特点实际上已经在规划被了,很有希出现。具体情况要览资源以及事先级而一定。

作者的对是:这个特性实际上已于统筹中了,很有梦想出现。具体情况要见到资源以及先行级而自然。

 

 

本文链接:http://www.cnblogs.com/hhelibeb/p/7976078.html

正文链接:http://www.cnblogs.com/hhelibeb/p/7976078.html

英文原文:ABAP News for Release 7.51 –
Enumerations

英文原稿:ABAP News for Release 7.51 –
Enumerations

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图