INTERFACE通过语句INTERFACE….ENDINTERFACE来定义。它可以有与类一样的部件。任何类都可以有一个或多个INTERFACE。通过在类的public部分进行声明,这样在interface中定义的public部分就成为类public interface的一部分。包含独立interface的类必须为类提供服务,这样用户可以通过interface来访问类,而无需知道其中的访问细节。
那么,实现这种机制的原理是什么呢?基本原理是你可以声明指针变量,而这个指针变量可以指向实施这个interface的任何类的对象。调用者只是与interface指针变量工作,而其无需知道其实际指向的是哪个类的对象。而调用者只需知道这个interface的相关属性就可以了。因为实现interface的类,就会实现在interface中定义的部分,所以只要通过interface调用者就可以实现自己的目的了。每个interface按照自己的目的定义自己的interface方法。比如不同类型的银行帐号,利息计算的方法不同。在interface中方法名和其参数是相同的。所以interface和继承是OO中实现多态的两种方式。通过interface指针变量来访问对象与通过父类的指针变量来访问子类的对象的道理一样。
下面的例子演示了两个毫无关系的类,account和customer:
CLASS account DEFINITION.
PUBLIC SECTION.
INTERFACES if_serializable_object.
….
ENDCLASS.
CLASS customer DEFINITION.
INTERFACES if_serializable_object.
ENDCLASS.
DATA:account TYPE REF TO account,
Customer TYPE REF TO customer,
Serializable_objects TYPE TABLE OF REF TO if_seriazable_object,
Serializable_object TYPE REF TO if_serializable_object,
Xmlstr TYPE string.
CREATE OBJECT accout EXPORTING id = ……,
Customer.
APPEND: account TO serializable_objects,
Customer TO serializable_objects.
LOOP AT serializable_objects INTO serializable_object.
CALL TRASFORMATION id
SOURCE obj = serializable_object
RESULT xml = xmlstr.
ENDLOOP.
Account是我们所熟悉的类,customer可能是整个业务应用的一部分或其他的什么,这都无所谓。但是这些类都有统一的interface,这是在6.10之后所支持的。本例中的interface可以使你把对象的属性序列化到xml文档中。具有INTERFACE if_serializable_object的类都具备了序列化的属性并对外提供了这种属性。
上面的例子演示了如何使用类account和customer的接口,在这个例子中,内表serializable_objects作为if_serializable_object指针变量的集会。假如说在程序中的某个部分,内表被遍历,那么通过语句CALL TRANSFORMATION可以将其序列化。在遍历的循环中对象的类是无关的,只有序列化的对象的属性是相关的。独立的interface使你只关注对象的某个方面,而不关注其他方面。相比之下,对于功能模块,你要输入的参数,与你手头的想要做的事情无关。
原因五,事件
应用中,用户界面的鼠标单击,新帐户的建立,都可以触发一个事件,这个事件要被他感兴趣的处理者知道。事件和事件处理与调用过程有相似之处:触发事件就相当于调用自程序,处理事件就相当于被调用子程序的主程序。区别是被调用的子程序和调用程序是帮定的一块儿的,而事件则不同,处理者有可能处理触发的事件,但也不一定。面向过程的ABAP的事件处理是通过运行时来实现的。而在OO中,类和对象既可以触发事件,又可以处理事件。下面将详细讨论这两种模式对事件处理的支持。