语法错误在先前的INTERFACES语句中,方法" METH1"被声明为非抽象

2020-09-14 19:17发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


(重要:我将其发布为问题,但我已经找到了解决方案,所以我也将其发布)

我在这里有一个错误(此代码是从ABAP文档中的接口,但我更改了接口的顺序):

接口intf1。
   方法meth1。
 结束界面。

 接口intf2。
   接口intf1。
   方法meth2。
 结束界面。

 类别cls定义摘要。
   公共部分。
     接口intf2抽象方法meth2。
     接口intf1抽象方法meth1。  " <===此处出现语法错误
 ENDCLASS。

我收到此语法错误:

在先前的INTERFACES语句中,方法" METH1"被声明为非抽象

为什么? 有什么解决方案?

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


(重要:我将其发布为问题,但我已经找到了解决方案,所以我也将其发布)

我在这里有一个错误(此代码是从ABAP文档中的接口,但我更改了接口的顺序):

接口intf1。
   方法meth1。
 结束界面。

 接口intf2。
   接口intf1。
   方法meth2。
 结束界面。

 类别cls定义摘要。
   公共部分。
     接口intf2抽象方法meth2。
     接口intf1抽象方法meth1。  " <===此处出现语法错误
 ENDCLASS。

我收到此语法错误:

在先前的INTERFACES语句中,方法" METH1"被声明为非抽象

为什么? 有什么解决方案?

付费偷看设置
发送
6条回答
SKY徐
1楼 · 2020-09-14 19:34.采纳回答

(请注意,在2011年也提出了相同的问题,并由 Suhas Saha ;您可能更喜欢他的答案,从技术上来讲,这还是一样的,但是我添加了有关ABAP 7.52的注释)

关于语法错误:实际上,以下语句使meth2抽象化,但也使其他方法具体化,尤其是intf1〜meth1

接口intf2抽象方法meth2。  

所以下一条语句

接口intf1抽象方法meth1。

与上一个将intf1〜meth1具体化的矛盾。

这就是语法错误的原因。

解决方案:要使程序编译,请切换两个INTERFACES语句:

接口intf1。
   方法meth1。
 结束界面。

 接口intf2。
   接口intf1。
   方法meth2。
 结束界面。

 类别cls定义摘要。
   公共部分。
     接口intf1抽象方法meth1。  "所以intf1〜meth1是抽象的
     接口intf2抽象方法meth2。 保持intf1〜meth1抽象!
 ENDCLASS。

这里引人注目的是这样的陈述

接口intf2抽象方法meth2。  

"保留intf〜meth1摘要"。 因此,根据先前的INTERFACES语句,如果已经在先前的INTERFACES语句中明确定义了抽象,则不会一直使intf1〜meth1变得具体。

---------------------------

新功能:请注意,从ABAP 7.52中可以避免此问题因为现在可以在INTERFACES内部使用〜(波浪号),所以您只能定义一个INTERFACES语句,如下所示(摘录自界面-抽象方法)

接口intf2抽象方法intf1〜meth1 meth2。  "有效期自7.52 

完整代码:

接口intf1。
    方法meth1。
 结束界面。

 接口intf2。
   接口intf1。
   方法meth2。
 结束界面。

 类别cls定义摘要。
   公共部分。
     接口intf2抽象方法intf1〜meth1 meth2。 从7.52起有效
 ENDCLASS。  

欢呼

小灯塔
2楼-- · 2020-09-14 19:52

有趣,感谢您的发帖。 但是,如果这是一个已回答的问题,那应该不是博客吗?

有意思的是,如果您在类中省略了INTF1的声明,会发生什么情况?

宇峰
3楼-- · 2020-09-14 19:49

两行符合"简单答案"的条件,我想您会以 小小的位子:-)

这项工作会在7.2之前完成吗? (目前没有要测试的系统):

接口intf1。
   方法meth1。
 结束界面。

 接口intf2。
   接口intf1。
   别名meth1 for intf1〜meth1。
   方法meth2。
 结束界面。

 类别cls定义摘要。
   公共部分。
     接口intf2抽象方法meth1 meth2。
 ENDCLASS。

Nir深蓝
4楼-- · 2020-09-14 19:44

也许,也许不是。 这只是一个简单的问题,一个简单的答案。 如果我们在该类中省略INTERFACES intf1,则intf1中的方法将是具体的,但是问题就不相关了,这里的目标是从2个接口中获得抽象方法。

梦想连接
5楼-- · 2020-09-14 19:47
# p #

不仅仅是纯粹的知识分子。 将其声明为抽象的原因是阻止人们使用模板方法,并迫使子类实现者重新定义它们。 如果您不重新定义它或从超类调用它,它将转储。

大简至美
6楼-- · 2020-09-14 19:29

它在7.51中有效。 就我而言,我不想直接公开intf1中的方法(我的类有很多方法,并且不给那些接口方法起别名的作用是让它们"隐藏在接口后面"),但是您的回答是有道理的,也值得作为解决方案 (我重新打开我的问题,以便您可以发布)。 谢谢。

一周热门 更多>