Methods ABAP中重写方法的扩展接口

Methods ABAP中重写方法的扩展接口,methods,overriding,abap,redefinition,Methods,Overriding,Abap,Redefinition,众所周知,无法在继承的ABAP类中扩展或重新定义重写方法的接口: 方法的接口和类别(通用或功能实例方法或事件处理程序)在重新定义中不会更改 这包括全局类和局部类的重新定义 如果要添加或删除方法参数或更改其类型,此限制的可能解决方法是什么?可选参数是一种方式,尽管不是很舒服。还有其他方法吗?您可以创建自己的接口,扩展现有接口。添加具有不同参数的相同方法。然后从扩展接口创建抽象类,并用代码填充方法,以调用实数方法,并将值设置为可选参数。然后从抽象中创建类 interface |--> exte

众所周知,无法在继承的ABAP类中扩展或重新定义重写方法的接口:

方法的接口和类别(通用或功能实例方法或事件处理程序)在重新定义中不会更改

这包括全局类和局部类的重新定义


如果要添加或删除方法参数或更改其类型,此限制的可能解决方法是什么?可选参数是一种方式,尽管不是很舒服。还有其他方法吗?

您可以创建自己的接口,扩展现有接口。添加具有不同参数的相同方法。然后从扩展接口创建抽象类,并用代码填充方法,以调用实数方法,并将值设置为可选参数。然后从抽象中创建类

interface
|--> extented interface
     |--> abstract class
          |--> class

您不能在接口方法的实现中以任何方式更改其签名。这仅仅是因为在运行时没有办法不产生难以分析的语法错误。接口是一个契约——任何实现它的类都承诺它将实现接口中存在的所有方法(和变量…)

假设存在一个接口
IF1
的方法
METH
,该方法采用类型
TYPE1
的单个参数
PAR1
。如果您现在编写一个类来实现一个方法
METH
,该方法使用一个类型为
TYPE2
的参数
PAR1
,那么您还没有编写一个类来实现
IF1
。将类型为
TYPE1
的参数传递给类的方法的调用程序将遇到类型转换错误(无论是在运行时还是在编译时,在某种程度上取决于类型的泛型)


因此,在重新定义接口方法时,如果不产生这样的运行时错误,就无法更改接口方法的签名-您的类不会实现接口。实现接口意味着类将完全接受为接口中的方法指定的参数的数量、类型和种类。实际上,没有任何用例可以让您有意义地想要更改它,同时仍然声称您的类实现了接口。无论您试图做什么,这都不是解决方案。

此请求几乎违反了我所知道的关于以类为中心的面向对象的所有知识。你为什么要那样做?这个界面应该是可靠的。你的超控将完全破坏这种可靠性。假设您添加了一个静态异常,例如,这将在所有实现者中产生语法错误。我不想破坏您的世界主干:),我只想找到一个解决方法,即最佳实践。
您为什么要这样做?
有时我们应该继承一个不能更改的父类。如果一个人需要用一些额外的接口参数重新实现它的方法,通常会做些什么呢?但是你想从中得到什么呢?有人称之为接口方法。他们依赖于它的定义。即使您现在能够更改此定义,调用方将如何意识到这一点?ABAP会简单地拒绝调用,因为它缺少一些参数,或者参数的类型错误。这甚至不特定于ABAP,在java和C++和C语言中,你会得到相同的结果。唯一不同的语言是以对象为中心的duck类型,比如JavaScript。