在从JDK 8开始的Java中,可以在方法签名的开头使用关键字default在接口中定义方法的默认实现,这主要是为了能够向接口添加新功能,并确保与为这些接口的旧版本编写的代码兼容.

除了默认方法之外,还可以在一个接口中定义static个方法,这使得在库中组织帮助器方法变得更容易,并使静态方法特定于同一接口中的接口,而不是在单独的类中.

在ABAP中有可能发生这样的事情吗?

由于我没有太多使用ABAP OO的经验,我没有找到确切的答案.

推荐答案

不幸的是,这在ABAP中是不可能的.

接口contains only definitions和实际实现必须在实现该接口的类中提供.接口的所有方法都是抽象的(即,它们是完全定义的,包括它们的签名,但没有实现).

与类不同,它根本不是接口does not have an implementation section.默认情况下,所有组件都在公共部分,那里有no visibility sections个组件,界面的所有组件都是可见的.

接口可以包含以下组件:

  • TYPESDATACLASS-DATACONSTANTS:数据类型和数据对象
  • METHODS, CLASS-METHODS, EVENTS, CLASS-EVENTS: methods and events
    interfaces provide fewer variants than classes for declarations of methods: no constructors, test methods, or AMDP function implementations are allowed
  • INTERFACES: inclusion of component interfaces;
    ALIASES: alias names for components of interfaces

As we can see CLASS-METHODS indeed allows to define static method declarations, and the static methods are just NOT instance specific. It means that when a class implements such an interface, the methods defined as static do not require an instance to access / call them and they rather can be called on the class itself like class_name=>interface_name~static_method_name.
So actually the purpose of declaring a method as static in an interface definition is to create an agreement that a particular method will not depend on an instance to work.

然而,还有PUBLICDEFAULT个关键字可能会在接口定义中使用,这在一开始可能会导致混淆.

接口定义如下所示:

INTERFACE intf [PUBLIC].
    [components]
ENDINTERFACE.

加法PUBLIC使接口成为类库的全局接口,并且只能用于接口池的全局接口,并且在创建全局接口时由类构建器创建.

Release 7.40, SP08开始提供关键字DEFAULT

METHODS meth [ABSTRACT|FINAL] | [DEFAULT IGNORE|FAIL] ...
CLASS-METHODS meth [DEFAULT IGNORE|FAIL] ...

语句METHODSCLASS-METHODS的加法DEFAULT可用于使这些方法成为可选的.实现接口时在类中显式显示的可选接口方法does not need to be implemented.相反,在定义中为非实现方法的调用指定了默认行为:

  • DEFAULT IGNORE-行为与使用空体实现时的行为相同
  • DEFAULT FAIL - raise an exception of the class CX_SY_DYN_CALL_ILLEGAL_METHOD
    in case if not handled, the runtime error CALL_METHOD_NOT_IMPLEMENTED is raised

当然,您可以使用继承来实现基本方法,使用实现的方法创建(抽象)类,并在必要时在子类(关键字方法)中重新植入/覆盖它们.REDIFINITION).

Java相关问答推荐

这个Apache Derby语法错误是什么?如何修复它?

OpenRewriter-如何替换连锁/流畅方法调用中的方法?

摆脱双列举导致的Json解析错误问题

长音符

转换为Biggram

有关手动创建的包的问题

如何在带有Micronaut的YAML中使用包含特殊字符的字符串作为键

暂停计时器

当Volatile关键字真的是必要的时候?

将PNG转换为位图自定义十六进制字符串

Android Studio模拟器没有互联网

在一行中检索字符分隔字符串的第n个值

无法使用Open WebStart Java 8运行jnlp

JavaFX:为什么我的ComboBox添加了一个不必要的单元格的一部分?

在Spring Boot中使用咖啡因进行缓存-根据输出控制缓存

谷歌应用引擎本地服务器赢得';t在eclipse上运行

[jdk21][Foreign Function&;Memory API]MemoryLayout::varHandle通过可变数组进行 struct 化的问题

Android上的SQLite:Android.database.SQLite.SQLiteReadOnlyDatabaseException:try 写入只读数据库(代码1032 SQLite_readonly_DBMOVED)

OpenJDK20:JEP434:Foreign Function&;内存API(第二次预览)

原始和参数化之间的差异调用orElseGet时可选(供应商)