通过接口标准化ABAP OO开发

通过接口对类方法进行更高层的抽象

接口使代码清晰易读

接口使你可以创建模拟对象(Mockup Object)以提高代码的可测试性

帮助实现SOLID原则

可以在不使用RTTS和类型转换的前提下使用多种类的不同实例。

因为在学习ABAP之前,我曾经学习过其它面向对象语言,因此我很纠结于ABAP中不存在的一个特性——重载方法(overload)。

也许你会问,重载是什么?

重载就是函数或者方法有相同的名称,但是参数列表和实现不相同的情形。

没有了重载,在某种程度上,类也许会变的过大,并且难以追踪那些有着相似行为但是名字不同的方法。

接口不提供重载能力,但是通过限制名字不同但是功能相近的方法的数量,接口可以整理和简化你的代码。

 

本文链接:

英文原文:Using interfaces to standardize your ABAP OO Development

简介

在ABAP中类的继承是单一继承(每个类只能有一个父类),接口实现可以有多个。

通过接口标准化ABAP OO开发

例如,上图中的LCL_Child_Class继承LCL_Parent_Class中所有的非私有变量、方法、类型和常量,并且必须实现LINF_Utility和LINF_Saver接口中所有的功能。

为了解释接口的定义,我将使用个“不怎么专业”的描述——它是一个类似于类的实体,不包含所声明的方法的任何具体实现,但是它可能包含常量、类型和变量。接口无法被初始化。

默认情况下接口的所有方法都必须被实现——这是面向对象编程中的一个通常的强制规则。不能允许接口方法的实现变得可选择,但是这不属于本文的讨论范围,所以不会展开论述。

(注:原文评论指出,在ABAP中,可以使用DEFAULT IGNORE|FAIL附加项指定一个可选的接口方法,虽然好像并没有什么用)

“真实”用例

设想下我们有个程序,需要从多种数据源获取数据并更新到表SFLIGHT:

Excel上传

RFC上传

在程序运行期间上传修改和插入的行

当然我们可以在该清单中添加ADBC源、经由HTTP客户端对象抓取的JSON/XML源等,但是我只是想介绍下要点,没必要穷举所有例子。

同时,因为本文只是对可能性的表述,因此我不会创建一个能真正工作的程序。

声明接口

我们将创建2个接口,不过在这个例子里只有一个是真实需要的。

第一个是最重要的,我命名它为linf_sflight_career,因为这是个用于EXCEL、RFC和本地表运输(carrier)的本地接口,在本地类中实现。

interface linf_sflight_carrier. types: tt_sflight type standard table of sflight with default key, st_sflight type sorted table of sflight with non-unique key mandt carrid connid, ht_sflight type hashed table of sflight with unique key mandt carrid connid fldate. methods: "! Returns hashed table SFLIGHT contents "! @parameter r_sflight | get_hashed_records returning value(r_sflight) type ht_sflight, "! Returns sorted table SFLIGHT contents "! @parameter r_sflight | get_sorted_records returning value(r_sflight) type st_sflight, "! Returns standard table SFLIGHT contents "! @parameter r_sflight | get_standard_records returning value(r_sflight) type tt_sflight. endinterface.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywzwp.html