2

有没有办法在没有 getter 的情况下获取对象私有属性的值。不允许以任何形式或形式修改类。

请在下面找到具有私有属性的示例类。

CLASS counter DEFINITION.
  PUBLIC SECTION.
    METHODS: set IMPORTING value(set_value) TYPE i.
  PRIVATE SECTION.
    DATA count TYPE i.
ENDCLASS.                    "counter DEFINITION 

CLASS counter IMPLEMENTATION.
  METHOD set.
    count = set_value.
  ENDMETHOD.                    "set
ENDCLASS.                    "counter IMPLEMENTATION

我怎样才能得到 的价值count?从计数器继承将不起作用,因为count它是私有的,不受保护。

4

3 回答 3

2

不幸的是,我自己尝试过很多不同的方法,但都不起作用:

  • 拥有标准超类——超类不能
    动态访问子类的私有属性
  • 创建子类永远不会起作用,因为它只能访问受保护的
  • 尝试使用单元测试框架不起作用。我试图调用允许访问私有数据的内核模块,但无济于事。

你基本上不走运。虽然取决于您尝试访问的课程,但有一个晦涩的选项。有些类具有指定为友元的接口,如果您实现该接口,您可以访问它们的私有数据(7.20 上的 ALV 就是这样),但不幸的是,这只在少数有限的情况下有效。

于 2013-10-23T15:57:38.120 回答
1

运行时类型服务是abap 的反射等价物。它们使您几乎可以扫描每个对象,并且大多数情况下甚至可以在运行时对其进行修改。据我所知,属性的可见性并不重要。但小心点。并阅读各种类,因为有很多类,每个类都指定用于特殊类型的数据对象(结构、对象等)

http://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=42965

于 2013-10-04T09:45:04.390 回答
0

您可以创建一个子类,重新实现 setter 并设置第二个变量,然后调用父方法。请注意让两个变量持有相同内容的后果...请参阅 vwegert 的评论,看看您是否真的想要这样做,因为这通常不是一个好主意,而且它违反了 OO 的规则。

CLASS counter_sub DEFINITION INHERITING FROM counter.
  PUBLIC SECTION.
    data count2 type i read-only.
    METHODS: set REDEFINITION.
ENDCLASS.                    "counter_sub DEFINITION

CLASS counter_sub IMPLEMENTATION.
  METHOD set.
    count2 = set_value.
    super->set( set_value ).
  ENDMETHOD.                    "set
ENDCLASS.                    "counter_sub IMPLEMENTATION
于 2013-10-03T22:23:32.483 回答