为什么在类的每个可见性部分都允许使用别名?

2020-09-08 22:33发布

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

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


专家您好,

我们知道,接口只能在类的公共部分中实现,但为什么在类的任何可见性部分中允许使用别名。 有什么具体目的吗? 检查以下样品。 在此代码中,由于在私有部分中声明了m1,因此在代码的最后一行出错。

 SPAN {
 字体家族:" Courier New";
 字体大小:10pt;
 颜色:#000000;
 背景:#FFFFFF;
 }
 .L0S52 {
 颜色:#0000FF;
 }
 .L0S55 {
 颜色:#800080;
 }
 .L0S70 {
 颜色:#808080;
 }

 接口1。
   方法:m1。
 结束界面。


 CLASS ICL定义。
   公共部分。
     接口1。
    专用部分。
     别名m1为if1〜m1。
 ENDCLASS。

 CLASS ICL实施。
   方法m1。
   终结法。
 ENDCLASS。

 选择开始。
   数据:lo类型参考文件。
   创建对象lo。
   lo-> if1〜m1()。  "没有语法错误
   lo-> m1()。  "语法错误

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

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


专家您好,

我们知道,接口只能在类的公共部分中实现,但为什么在类的任何可见性部分中允许使用别名。 有什么具体目的吗? 检查以下样品。 在此代码中,由于在私有部分中声明了m1,因此在代码的最后一行出错。

 SPAN {
 字体家族:" Courier New";
 字体大小:10pt;
 颜色:#000000;
 背景:#FFFFFF;
 }
 .L0S52 {
 颜色:#0000FF;
 }
 .L0S55 {
 颜色:#800080;
 }
 .L0S70 {
 颜色:#808080;
 }

 接口1。
   方法:m1。
 结束界面。


 CLASS ICL定义。
   公共部分。
     接口1。
    专用部分。
     别名m1为if1〜m1。
 ENDCLASS。

 CLASS ICL实施。
   方法m1。
   终结法。
 ENDCLASS。

 选择开始。
   数据:lo类型参考文件。
   创建对象lo。
   lo-> if1〜m1()。  "没有语法错误
   lo-> m1()。  "语法错误
付费偷看设置
发送
2条回答
大简至美
1楼-- · 2020-09-08 22:59

通常,直接从实现类的实例调用接口方法似乎有点困难。 这意味着您正在对REF lcl使用实例变量类型,这通常是不正确的。 您应该使用:

数据:lo TYPE REF TO LIF。
   创建对象lo类型lcl。
   lo-> m1()。  

不过,在一个类中,您可能需要节省一些键入内容,因此请使用私有别名。

在我看来,使用私有别名比使用公共别名更合理。

唯一的例外是从类中提取接口时 ,并且您不需要更改所有使用该类的程序现在就可以通过接口进行操作。

绿领巾童鞋
2楼-- · 2020-09-08 23:06

我想您的问题是从" OO设计"的角度出发的,为什么选择SAP 设计了拥有私人别名的可能性? (因为从技术上讲,很明显私有别名只能在类内部及其类的朋友内部使用)。

我的猜测:

1)当两个 对象将通过类而不是通过接口实例化,并且别名成员通常在外部使用(在类及其朋友之外)。

2)有时,成员很少在外部使用,但经常 内部使用(在班级内部或由其朋友使用)。 要遵循该规则,请仅公开最小的公共名称,并将其声明为私有别名。

PS:如果要分析SAP实际情况,则以下SQL查询列出了具有公共名称的(标准)类 和专用别名:

 SELECT DISTINCT CLSNAME
 从SEOCOMPODF A
 存在的地方(
 选择*从SEOCOMPODF B
 A.CLSNAME = B.CLSNAME AND ALIAS ='X'AND EXPOSURE = 0)
 和存在(
 选择*从SEOCOMPODF B
 A.CLSNAME = B.CLSNAME AND ALIAS ='X'AND EXPOSURE = 2)

下面的SQL查询列出了(标准)类,这些类在具有相同别名的组件上具有公共和私有别名 不同的接口:

 SELECT DISTINCT CLSNAME
 从SEOCOMPODF A
 存在的地方(
 选择 *
 从SEOCOMPODF B
 其中A.CLSNAME = B.CLSNAME
 AND A.REFCLSNAME <> B.REFCLSNAME
 AND A.REFCMPNAME = B.REFCMPNAME
 AND A.ALIAS ='X'
 AND B.ALIAS ='X'
 AND A.EXPOSURE = 2
 AND B.EXPOSURE <> 2)

一周热门 更多>