Как да четем частен атрибут на обект без getter в ABAP

Има ли някакъв начин да получите стойността на частния атрибут на обект без 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? Наследяването от counter няма да работи, защото count е частно, незащитено.


person tis.sandor    schedule 03.10.2013    source източник
comment
Можете ли да поясните? Може би с някакви кодове?   -  person Raptor    schedule 03.10.2013
comment
Защо хората винаги се опитват да нарушат най-ценните идеи за разработка на обектно-ориентиран софтуер?   -  person vwegert    schedule 03.10.2013
comment
Винаги можете да създадете нов клас, да наследите от стария и сами да добавите getter.   -  person Raven Dreamer    schedule 03.10.2013
comment
@RavenDreamer: Ако атрибутът е частен, не можете. Ако създаването на обект не е ваше, за да влияете или отменяте, вие дори не можете да инжектирате свой собствен клас.   -  person vwegert    schedule 03.10.2013
comment
@vwegert Работя при предположението, че tis.sandor иска достъп до частен атрибут на стандартен ABAP клас (като CL_ALV_GRID). Това би бил основният случай на невъзможност за модифициране на класа. Ако не може да направи никакви нови класове, той няма късмет.   -  person Raven Dreamer    schedule 03.10.2013
comment
@RavenDreamer: Дори тогава не можете да получите достъп до частен атрибут, като използвате инструмент за получаване на подклас. Тук бъркате частно и защитено.   -  person vwegert    schedule 03.10.2013
comment
@vwegert Мисля, че си прав. Touche.   -  person Raven Dreamer    schedule 03.10.2013


Отговори (3)


За съжаление не, опитах това сам по много различни начини, нито един от които не работи:

  • Притежаване на стандартен супер клас - супер класът няма динамичен достъп до
    личните атрибути на подкласовете
  • Създаването на подклас никога няма да работи, тъй като той може да има достъп само защитен
  • Опитът да се използва рамката за единичен тест не работи. Опитах се да извикам модулите на ядрото, които позволяват достъп до лични данни, но без резултат.

По принцип нямате късмет. Въпреки това има една неясна опция в зависимост от класа, до който се опитвате да получите достъп. Някои класове имат интерфейси, посочени като приятели и ако имплементирате този интерфейс, можете да получите достъп до личните им данни (ALV на 7.20 е като този), но за съжаление това ще работи само в няколко ограничени случая.

person DW8Reaper    schedule 23.10.2013

Услугите от тип Runtime са еквивалентът на отражението на abap. Те Ви позволяват да сканирате почти всеки обект и най-вече дори да го модифицирате по време на изпълнение. Доколкото знам, видимостта на атрибутите няма значение. Но внимавай. И прочетете за различните класове, защото има много, всеки е определен да работи върху специален тип dataopbject (структури, обекти и т.н.)

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

person icbytes    schedule 04.10.2013

Можете да направите подклас, да имплементирате отново сетера и да зададете втора променлива, след което да извикате родителския метод. Бъдете наясно с последиците от наличието на две променливи, които съдържат едни и същи неща... Моля, вижте коментарите на 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
person Jorg    schedule 03.10.2013