Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ABAP中不使用getter读取对象的私有属性_Abap - Fatal编程技术网

如何在ABAP中不使用getter读取对象的私有属性

如何在ABAP中不使用getter读取对象的私有属性,abap,Abap,是否有任何方法可以在没有getter的情况下获取对象私有属性的值。不允许以任何形状或形式修改类 请在下面找到一个具有私有属性的示例类 CLASS counter DEFINITION. PUBLIC SECTION. METHODS: set IMPORTING value(set_value) TYPE i. PRIVATE SECTION. DATA count TYPE i. ENDCLASS. "counter DEFINIT

是否有任何方法可以在没有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

如何获取计数的值?从计数器继承将不起作用,因为计数是私有的,不受保护。

您可以创建一个子类,重新实现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

运行时类型服务相当于abap的反射。 它们允许您几乎扫描每个对象,甚至在运行时修改它。据我所知,属性的可见性并不重要。但是要小心。 并阅读有关各种类的内容,因为有很多类,每个类都指定用于处理特殊类型的DataOpObject(结构、对象等)


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

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

你基本上运气不佳。根据您试图访问的类,有一个模糊的选项。有些类具有指定为好友的接口,如果您实现该接口,您可以访问它们的私有数据(7.20上的ALV就是这样),但不幸的是,这只在少数有限的情况下起作用。

您能澄清一下吗?也许有一些代码?为什么人们总是试图打破面向对象软件开发的最有价值的想法?你总是可以创建一个新类,继承旧类,然后自己添加一个getter。@RavenDreamer:如果属性是私有的,你就不能。如果对象创建不是由您来影响或覆盖的,您甚至不能注入您自己的类。@vwegert我是在假设tis.sandor想要访问标准ABAP类(如CL_ALV_GRID)的私有属性的情况下工作的。这就是“无法修改类”的主要情况。如果他不能上新课,那他就倒霉了。