在 Java 中,从 JDK 8 开始,可以在方法签名开头使用
default
关键字在接口中定义方法的默认实现,主要是为了能够向接口添加新功能并确保与代码的兼容性为这些接口的旧版本编写。
除了默认方法之外,还可以在接口中定义
static
方法,这样可以更轻松地在库中组织辅助方法,并将特定于接口的静态方法保留在同一接口中,而不是在单独的类中。
ABAP 中可能有这样的事情吗?
由于我对ABAP OO没有太多经验,所以我没有找到确切的答案。
不幸的是,这在 ABAP 中是不可能的。
接口仅包含定义,并且实际的实现必须在实现该接口的类中提供。接口的所有方法都是抽象的(即它们是完全定义的,包括它们的签名,但未实现)。
与类不同,接口根本没有实现部分。 默认情况下,所有组件都位于 PUBLIC 部分,没有可见性部分,并且界面的所有组件都是可见的。
接口可以具有以下组件:
TYPES
、DATA
、CLASS-DATA
、CONSTANTS
:数据类型和数据对象
METHODS
、CLASS-METHODS
、EVENTS
、CLASS-EVENTS
:方法和事件
接口为方法声明提供的变体比类少:不允许构造函数、测试方法或 AMDP 函数实现
INTERFACES
:包含组件接口;
ALIASES
:接口组件的别名
正如我们所看到的
CLASS-METHODS
确实允许定义静态方法声明,并且静态方法只是不是特定于实例的。这意味着当一个类实现这样的接口时,定义为静态的方法不需要实例来访问/调用它们,而是可以在类本身上调用它们,如class_name=>interface_name~static_method_name
。
在接口定义中将方法声明为静态的目的实际上是为了创建一个协议,即特定的方法将不依赖于实例来工作。
但是,还有
PUBLIC
和 DEFAULT
关键字可能会在接口定义中使用,并且一开始可能会导致混乱。
接口定义如下:
INTERFACE intf [PUBLIC].
[components]
ENDINTERFACE.
补充
PUBLIC
使接口成为类库的全局接口,只能用于接口池的全局接口,由类构建器在创建全局接口时创建。
DEFAULT
自 版本 7.40、SP08 起可用
METHODS meth [ABSTRACT|FINAL] | [DEFAULT IGNORE|FAIL] ...
CLASS-METHODS meth [DEFAULT IGNORE|FAIL] ...
语句
DEFAULT
和METHODS
的添加CLASS-METHODS
可用于使这些方法可选。当实现接口时,可选接口方法不需要在类中显式实现。相反,为定义中未实现的方法的调用指定了默认行为:
DEFAULT IGNORE
- 行为与使用空主体实现时相同
DEFAULT FAIL
- 引发班级异常 CX_SY_DYN_CALL_ILLEGAL_METHOD
如果不处理,则会引发运行时错误
CALL_METHOD_NOT_IMPLEMENTED
当然,您可以使用继承来实现基本方法,创建一个具有已实现方法的(抽象)类,并在必要时在子类中重新实现/覆盖它们(关键字 METHODS ..
REDEFINITION
)。