Текущее время: Пт, май 16 2025, 15:03

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Дополнение %_FRIEND инструкции DATA ... TYPE REF TO class
СообщениеДобавлено: Пн, дек 26 2005, 15:32 
Менеджер
Менеджер

Зарегистрирован:
Чт, янв 20 2005, 08:34
Сообщения: 573
Пол: Мужской
Господа!
Может кто-нибудь рассказать действие дополнения
%_FRIEND
для инструкции DATA ... TYPE REF TO class.

В хелпе написано:

Цитата:

Adding the %_FRIEND addition to the DATA ... TYPE REF TO class statement lets you access all the methods and data elements of the class class.




Только вот к приватной секции я все равно доступ не получил.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, дек 27 2005, 15:15 
Гость
там ведь черным по белому написано, это дополнение позволяет получить доступ ко всем компонентам класса

т.е. объявляешь какую-нибудь переменную с этим дополнением, например data: lcl_grid type ref to cl_gui_alv_grid %_friend. и можешь вызывать любые методы (и защищенные и скрытые) и читать любые атрибуты (и защищенные и скрытые)


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, дек 27 2005, 15:19 
Гость
только работает эта штука в контесте класса, т.е. в простом отчете такое объявление написать не удастся нужен локальный класс


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, дек 28 2005, 14:40 
Менеджер
Менеджер

Зарегистрирован:
Чт, янв 20 2005, 08:34
Сообщения: 573
Пол: Мужской
Цитата:
т.е. объявляешь какую-нибудь переменную с этим дополнением, например data: lcl_grid type ref to cl_gui_alv_grid %_friend. и можешь вызывать любые методы (и защищенные и скрытые) и читать любые атрибуты (и защищенные и скрытые)


Ну вот напиши пожалуйста черным по-белому малюсенький рабочий примерчик состоящий из 4 строк. А то что-то у меня не получается.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, дек 28 2005, 17:15 
Гость
системы сейчас под рукой нет, но будет примерно так

report z_test.

parameters: sp_belnr type bkpf-belnr obligatory.

class lcl_handler definition.
protected section.
methods: select_data importing i_belnr exceptions not_found.
privet section.
data: at_data type table of bkpf.
methods: write_data.
ebdclass.

class lcl definition.
public section.
class-data: handler type ref to lcl_handler %_friend.
class-methods: class_constructor.
endclass.


class lcl implemetation.
method class_constructor.
create object lcl=>handler.
endmethod.
endclass.

class lcl_handler implemantation.
method select_data.
if i_ebeln is initial.
message s600(rf) with 'Укажите №' raising not_found.
endif.
free: me->at_data.
select belnr gjahr bukrs
into corresponding fields of table me->at_data
from bkpf
where belnr = i_belnr.
if not sy-subrc is initial.
message s600(rf) with 'Документы не найдены' raising not_found.
endif.
endmethod.
method write_data.
data: ls_data type bkpf.
loop at me->at_data
into ls_data
write: / ls_data-bukrs, ls_data-gjahr, ls_data-ebeln.
endloop.
endmethod.
endclass.

start-of-selection.
call method lcl=>handler->select_data "с другом такой вызов возможен
exporting i_ebeln = sp_ebeln
exceptions others = 1.
if not sy-subrc is initial.
message id sy-msgid type sy-msgty ...
exit.
endif.

end-of-selection.
call method lcl=>handler->write_data. "и такой тоже
free: lcl=>handler->at_data. "и на это не должен ругаться


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, дек 29 2005, 08:27 
Менеджер
Менеджер

Зарегистрирован:
Чт, янв 20 2005, 08:34
Сообщения: 573
Пол: Мужской
Попробовал. Версия 4.6С.

Сделал код таким, чтобы не было других синтаксических ошибок:

Code:

REPORT ZTEST .

parameters: sp_belnr type bkpf-belnr obligatory.

*---------------------------------------------------------------------*
*       CLASS lcl_handler DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
class lcl_handler definition.
  protected section.
    methods: select_data
               importing i_belnr type bkpf-belnr
               EXCEPTIONS not_found.
  private section.
    data: at_data type table of bkpf.
    methods: write_data.
endclass.

*---------------------------------------------------------------------*
*       CLASS lcl DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
class lcl definition.
  public section.
    class-data: handler type ref to lcl_handler %_friend.
    class-methods: class_constructor.
endclass.

*---------------------------------------------------------------------*
*       CLASS lcl IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
class lcl implementation.

  method class_constructor.
    create object lcl=>handler.
  endmethod.

endclass.

*---------------------------------------------------------------------*
*       CLASS lcl_handler IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
class lcl_handler implementation.

  method select_data.
    if i_belnr is initial.
      message s600(rf) with 'Укажите №' raising not_found.
    endif.
    free: me->at_data.
    select belnr gjahr bukrs
      into corresponding fields of table me->at_data
      from bkpf
      where belnr = i_belnr.
    if not sy-subrc is initial.
    message s600(rf) with 'Документы не найдены' raising not_found.
    endif.
  endmethod.

  method write_data.
    data: ls_data type bkpf.
    loop at me->at_data
      into ls_data.
      write: / ls_data-bukrs, ls_data-gjahr, ls_data-belnr.
    endloop.
  endmethod.

endclass.

start-of-selection.

call method lcl=>handler->select_data " с другом такой вызов возможен
  exporting
    i_ebeln = sp_ebeln
  exceptions
    others = 1.
if not sy-subrc is initial.
*  message id sy-msgid type sy-msgty.
  exit.
endif.

end-of-selection.

call method lcl=>handler->write_data. " и такой тоже
free: lcl=>handler->at_data. " и на это не должен ругаться



В результате то, о чем Вы говорили, так и не получилось.

1.

call method lcl=>handler->select_data " с другом такой вызов возможен

На этой строке говорит:

Цитата:

Access to protected method "SELECT_DATA" is not allowed.



2.

call method lcl=>handler->write_data. " и такой тоже

На этой строке говорит:

Цитата:

You cannot access private method "WRITE_DATA" is not allowed.


3.

free: lcl=>handler->at_data. " и на это не должен ругаться

На этой строке говорит:

Цитата:

Access to private attribute "AT_DATA" is not allowed.



О чем я в начале темы и спрашивал.

Цитата:

Цитата:

Adding the %_FRIEND addition to the DATA ... TYPE REF TO class statement lets you access all the methods and data elements of the class class.


Только вот к приватной секции я все равно доступ не получил.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, дек 29 2005, 12:12 
Гость
может и вызов должен происходить в классе
class lcl imlementation.
method select_data. "публичный
call method lcl=>handler->select_data
exporting i_ebeln = i_ebeln
exceptions others = 1.
if not sy-subrc is initial.
message ... raising not_found.
endif.
endmethod.
endclass.
и вызывать этот метод из отчета

вообще у меня получалось в 4.6C
система будет, только в середине января, тогда посмотрю конкртенее и отвечу, но работать должно


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, дек 29 2005, 12:49 
Менеджер
Менеджер

Зарегистрирован:
Чт, янв 20 2005, 08:34
Сообщения: 573
Пол: Мужской
Ну вот , значит пока все как и раньше. Ответа нет.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: re
СообщениеДобавлено: Чт, дек 29 2005, 14:23 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
наверное не надо объявлять %_friend в статическом члене, который по сути является глобальным,
попробуй объявить data: вместо class-data:, тогда вызов в нестатическом методе (methods) будет
инкапсулированным, может сработает


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 08:15 
Менеджер
Менеджер

Зарегистрирован:
Чт, янв 20 2005, 08:34
Сообщения: 573
Пол: Мужской
Так ведь

Цитата:
kastaliec писал:

там ведь черным по белому написано, это дополнение позволяет получить доступ ко всем компонентам класса


Видимо не только я не понимаю черные буковки на белом фоне, но и

Цитата:
kastaliec


тоже.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: re
СообщениеДобавлено: Пт, янв 13 2006, 10:27 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
не догоняю вашу мысль..

пробовал вчера проверить, модификатор %_friend в 4.7 deprecated,
нужно в класс пуле делать такое:

class cl_userclass definition deferred.
class cl_globalclass definition local friends cl_usrclass
.
class cl_userclass defintion.
.. section.
data that type ref to cl_globalclass.

...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 14:37 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
%_friend - в 4.7 нет.
В 4.6 такое декларирование позволяет получть доступ ко всем членам класса без ведома этого класса. Это не аналог FRIENDS.

Code:
CLASS lcl_1 DEFINITION.
  PRIVATE SECTION.
    DATA privdata.
ENDCLASS.

CLASS lcl_2 DEFINITION.
  PUBLIC SECTION.
    DATA: l_obj TYPE REF TO lcl_1 %_FRIEND.
    METHODS fill.
ENDCLASS.

CLASS lcl_2 IMPLEMENTATION.
  METHOD fill.
    CREATE OBJECT l_obj.
    l_obj->privdata = 'A'.
    WRITE: l_obj->privdata.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

  DATA: obj_2 TYPE REF TO lcl_2.
  CREATE OBJECT obj_2.

  CALL METHOD obj_2->fill( ).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 15:24 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
T написал:
%_friend - в 4.7 нет.
В 4.6 такое декларирование позволяет получть доступ ко всем членам класса без ведома этого класса. Это не аналог FRIENDS.

Code:
CLASS lcl_1 DEFINITION.
  PRIVATE SECTION.
    DATA privdata.
ENDCLASS.

CLASS lcl_2 DEFINITION.
  PUBLIC SECTION.
    DATA: l_obj TYPE REF TO lcl_1 %_FRIEND.
    METHODS fill.
ENDCLASS.

CLASS lcl_2 IMPLEMENTATION.
  METHOD fill.
    CREATE OBJECT l_obj.
    l_obj->privdata = 'A'.
    WRITE: l_obj->privdata.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

  DATA: obj_2 TYPE REF TO lcl_2.
  CREATE OBJECT obj_2.

  CALL METHOD obj_2->fill( ).


так я и думал... это не френды - это хак :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 15:55 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
А вот чем плохо иметь друзей (код, разумеется, для 4.7):
Code:
class lcl_1 definition.
  ...
endclass.

class lcl_2 definition friends lcl_1.
  private section.
    data: a.
endclass.

class lcl_3 definition inheriting from lcl_1.
  public section.
    data: obj type ref to lcl_2.
    methods: fill.
endclass.

class lcl_3 implementation.
  method fill.
    create object obj.
    obj->a = 'A'.
    write obj->a.
  endmethod.
endclass.

start-of-selection.
  data: obj type ref to lcl_3.
  create object obj.
  obj->fill( ).


Если объявить себе друга, то другом автоматически становиться и наследник друга, что в принципе логично, но ставит под угрозу всю инкапсуляцию..

PS. В этом смысле, если друг FINAL, то есть ненаследуемый, то всё ОК


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб, янв 14 2006, 12:29 
Гость
Проверил код, "T" верно сказал, в 4.6C чтоб хак заработал друга надо объявлять в классе, и обращение к защищенным и скрытым методам/атрибутам тоже должно быть в классе.
А вот нужно так делать или нет это другой вопрос.
Считаю это можно использовать только если по другому ну просто ни как. Я лично с такой жесткой необходимостью еще не сталкивался


Принять этот ответ
Вернуться к началу
  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Ahrefs [Bot], Yandex [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB