面向对象模式的数据封装
OO模式的编程也有两种数据类型,类实例的属性和类方法中的本地变量。
实例属性的生命周期依赖于对象的生命周期,本地变量的生命周期依赖于类方法的生命周期。所以面向对象的本地变量与面向过程的本地变量的生命周期是一样的。它是类方法中的辅助变量与数据封装无关。ABAP对象的数据封装在类这个级别。可以定义类属性的可见性,它的级别分别是在类内可见,在子类中可见,或者在外部类中可见。下面的例子演示了如何在类中封装银行账号:
CLASS account DEFINITION.
PUBLIC SECTION.
METHODS: constructor IMPORTING id TYPE account-id,
Deposit IMPORTING amount TYPE accounts-amount,
Withdraw IMPORTING amount TYPE accounts-amount
RAISING cx_negative_amount,,
Transfer IMPORTING amount TYPE accounts-amount
Target REF TO account
RAISING cx_negative_amount.
PRIVATE SECTION.
DATA amount TYPE accounts-amount.
ENDCLASS.
CLASS account IMPLEMENTATION.
METHOD constructor.
SELECT SINGLE amount INTO (amount)
FROM accounts
WHERE id = id.
ENDMETHOD.
METHOD deposit.
Me->amount = me->amount + amount.
ENDMETHOD.
METHOD withdraw.
IF me->amount > amount.
Me->amount = me->amount – amount.
ELSE.
RAISE EXCEPTION TYPE cx_negative_amount.
ENDIF.
ENDMETHOD.
METHOD transfer.
Me->withdraw( amount ).
Target->deposit( amount ).
ENDMETHOD.
ENDCLASS.
在account类的定义部分可以定义属性和方法的可见性(private public)。类的定义把功能和数据结合到了一块。理论上,前面例子的功能池也做到了这点,只不过在不同的数据模块间进行交互的时候就暴露了其局限性,所以功能池只能说是多个功能模块的容器还不能真正的共享数据。在ABAP OO的类中PUBLIC部分定义了其与外部交互的接口。在这个例子中描述类状态的属性是私有的,而对外的公共接口是操作这些属性的方法。
这个例子中的类既实现了前面面向过程的第一个例子的简单功能也实现了第二个例子较为复杂的功能。这个类的deposit,withdraw方法与第一个例子的两个功能模块的作用相同,由于你可以创建一个类的多个对象,所以这个类只需封装一个银行帐号的数据即可,constructor方法用来为不同的银行账号初始化数据。由于每个对象都有它自己的数据,所以你不需为类添加额外的参数。最后,不止于此,由于一个对象可以调用另外一个对象的方法,那么不同银行账号之间的交互便有了更加简洁的方案,这例子中transfer功能的实现要比前面第二个例子的实现简单的多。
转载于:https://www.cnblogs.com/andyfurong/archive/2011/01/05/1926408.html