Текущее время: Сб, май 17 2025, 01:55

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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