Текущее время: Вс, июн 22 2025, 23:45

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Определить имя класса
СообщениеДобавлено: Пт, сен 17 2010, 08:06 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
есть вот такой код:
Code:
REPORT  ztest1.

CLASS parent DEFINITION.
  PUBLIC SECTION.
      CLASS-METHODS stat_meth.
ENDCLASS.

CLASS child DEFINITION INHERITING FROM parent.
ENDCLASS.

CLASS parent IMPLEMENTATION.
  METHOD stat_meth.
    " parent or child?
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
CALL METHOD parent=>stat_meth( ).
CALL METHOD child=>stat_meth( ).

Вопрос такой - возможно ли внутри статического метода stat_meth определить посредством какого класса был вызов, parent или child?

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Пт, сен 17 2010, 08:51 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Чт, ноя 20 2008, 16:29
Сообщения: 245
Откуда: RU->DE
Пол: Мужской
Для данного текста можно так. В общем случае конечно надо более подробный разбор.

Code:
   DATA: callstack TYPE ABAP_CALLSTACK,
         stack_line LIKE LINE OF callstack.
   CALL FUNCTION 'SYSTEM_CALLSTACK'
     EXPORTING
       MAX_LEVEL          = 2
     IMPORTING
       CALLSTACK          = callstack.
   READ TABLE callstack INTO stack_line
        INDEX 2.
   READ REPORT stack_line-include INTO itab.
   READ TABLE itab INTO str
        INDEX stack_line-line.
   FIND REGEX '([^\s]*)=>' IN str
        SUBMATCHES str.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Пт, сен 17 2010, 09:00 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
BaBuin написал:
Для данного текста можно так. В общем случае конечно надо более подробный разбор

Спасибо, но это как то уж совсем грязный хак :) Да и ненадежный

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Пт, сен 17 2010, 09:09 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, июл 15 2009, 05:55
Сообщения: 174
Откуда: Мегион - > СПб
Пол: Мужской
А почему просто не импортировать в данный метод параметр kl - название класса. Или это по-деревенски

REPORT ztest1.

CLASS parent DEFINITION.
PUBLIC SECTION.
CLASS-METHODS stat_meth importing kl type string.
ENDCLASS.

CLASS parent IMPLEMENTATION.
METHOD stat_meth.
CASE kl.
WHEN 'PARENT'.
break-point.
WHEN 'CHILD'.
break-point.
ENDCASE.

ENDMETHOD.
ENDCLASS.

CLASS child DEFINITION INHERITING FROM parent.

ENDCLASS.


START-OF-SELECTION.

CALL METHOD parent=>stat_meth exporting kl = 'PARENT' .
CALL METHOD child=>stat_meth exporting kl = 'CHILD' .

_________________
Ничто так не заразительно, как смех начальника...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Пт, сен 17 2010, 09:29 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Чт, ноя 20 2008, 16:29
Сообщения: 245
Откуда: RU->DE
Пол: Мужской
Я так понимаю вызов метода происходит не в своей программе


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Пт, сен 17 2010, 09:34 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
LinevskiySV написал:
А почему просто не импортировать в данный метод параметр kl - название класса. Или это по-деревенски

Именно :) Передавать имя класса - самое простое, но не очень красивое решение

BaBuin написал:
Я так понимаю вызов метода происходит не в своей программе

Вызов в своей программе, собственно через передачу имени класса сейчас и сделано. Но хочется чего то более красивого, ну и плюс академический интерес

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Пт, сен 17 2010, 10:11 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, мар 16 2005, 09:37
Сообщения: 42
Откуда: Москва
ArmAnn написал:
LinevskiySV написал:
А почему просто не импортировать в данный метод параметр kl - название класса. Или это по-деревенски
Именно :) Передавать имя класса - самое простое, но не очень красивое решение
Сама проблема сформулирована не очень красиво. Заставлять предка знать своих потомков как-то не правильно. Не объектно-ориентированно...
Единственная уважительная причина подобного решения - это фабричный метод, который создает объект нужного класса-потомка. В остальных случаях должен работать полиморфизм


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Пт, сен 17 2010, 10:18 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Valerius написал(а):
Сама проблема сформулирована не очень красиво. Заставлять предка знать своих потомков как-то не правильно. Не объектно-ориентированно...
Единственная уважительная причина подобного решения - это фабричный метод, который создает объект нужного класса-потомка. В остальных случаях должен работать полиморфизм

Для фабричных методов лучше создавать отдельный фабричный класс.
В остальном согласен - задача не имеет красивого решения.

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Пт, сен 17 2010, 11:09 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
Valerius написал(а):
Единственная уважительная причина подобного решения - это фабричный метод, который создает объект нужного класса-потомка. В остальных случаях должен работать полиморфизм

Да, вы правы - это фабричный метод

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Пт, сен 17 2010, 12:00 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, мар 16 2005, 09:37
Сообщения: 42
Откуда: Москва
ArmAnn написал:
Valerius написал(а):
Единственная уважительная причина подобного решения - это фабричный метод, который создает объект нужного класса-потомка. В остальных случаях должен работать полиморфизм
Да, вы правы - это фабричный метод
Тоже пытался красиво решить подобную задачу. Ни одна из идей не заработала. Все упирается в то, что узнать класс можно только создав объект, а создать объект можно только зная название класса.
Так что считаю, что нет ничего зазорного в том, чтобы константой задавать реальный класс создаваемого объекта. Только лучше название класса не передавать в параметрах, а определять внутри метода на основании определенных критериев (например, параметров экрана выбора)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Пт, сен 17 2010, 17:13 
Специалист
Специалист

Зарегистрирован:
Вс, мар 13 2005, 13:59
Сообщения: 201
Откуда: Moscau
ИМХО задача изнутри метода не решаема.
Я попробовал решить это через конструктор классов, но получил совсем неожиданные результаты. Есть идеи почему так?
Code:
REPORT  ztest1.

CLASS parent DEFINITION.
  PUBLIC SECTION.
      CLASS-METHODS stat_meth.
      class-data who_am_i type char1 VALUE 'P' .
ENDCLASS.

CLASS child DEFINITION INHERITING FROM parent.
    PUBLIC SECTION.
    class-methods CLASS_CONSTRUCTOR.
    CLASS-METHODS stat_meth2.
ENDCLASS.

CLASS parent IMPLEMENTATION.
  METHOD stat_meth.
    " parent or child?
   WRITE: / who_am_i.
  ENDMETHOD.
ENDCLASS.
CLASS  child  IMPLEMENTATION.
  METHOD CLASS_CONSTRUCTOR.
    who_am_i = 'C'.
  ENDMETHOD.
  METHOD stat_meth2.
    " parent or child?
   WRITE: / who_am_i.
  ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
CALL METHOD child=>stat_meth( ).
CALL METHOD parent=>stat_meth( ).

CALL METHOD child=>stat_meth2( ).
CALL METHOD child=>stat_meth( ).
CALL METHOD parent=>stat_meth( ).

Вывод программы:
Code:
P
P
C
C
C

Я ожидал, что поведение будет близко к 2-м инстанциям класса, что они будут независимы и для каждого из них выховится свой класс конструктор. Но пока не вызовешь stat_meth2 - конструктор child'а не срабатывает.
кто-нибудь понимает почему так?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Пт, сен 17 2010, 18:23 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
Boger написал(а):
Я ожидал, что поведение будет близко к 2-м инстанциям класса, что они будут независимы и для каждого из них выховится свой класс конструктор. Но пока не вызовешь stat_meth2 - конструктор child'а не срабатывает.
кто-нибудь понимает почему так?

Да тут все вроде логично и объяснимо - конструктор класса вызывается при первом обращении к компонентам класса. Когда вы вызывали stat_meth - он принадлежит к классу parent, и конструктор класса child не вызывается. А как только вызвали метод child=>stat_meth2 - то тут же отработал и конструктор.

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Вс, сен 19 2010, 18:36 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
А если сделать метод вида get_my_name, который будет переопределяться у потомков. Только в нем не надо ссылаться на статические переменные, а возвращать константу?
parent method get_my_name return 'CLASS1'.
chil1 method get_my_name return 'CLASS2'.
chil2 method get_my_name return 'CLASS3'.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Вс, сен 19 2010, 18:53 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
__Gennady написал(а):
А если сделать метод вида get_my_name, который будет переопределяться у потомков. Только в нем не надо ссылаться на статические переменные, а возвращать константу?
parent method get_my_name return 'CLASS1'.
chil1 method get_my_name return 'CLASS2'.
chil2 method get_my_name return 'CLASS3'.

В данном случае не подходит - если get_my_name сделать статическим, то не получится его переопределить. А инстанцируемым делать его смысла нет

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить имя класса
СообщениеДобавлено: Пн, сен 20 2010, 08:19 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, мар 16 2005, 09:37
Сообщения: 42
Откуда: Москва
Последние сообщения навеяли
Code:
REPORT  ytest.

CLASS parent DEFINITION ABSTRACT.
  PUBLIC SECTION.
    METHODS meth.
    DATA who_am_i TYPE char1 VALUE 'P' .
ENDCLASS.

CLASS child1 DEFINITION INHERITING FROM parent CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS create
      RETURNING
        value(_ro_child) TYPE REF TO child1.
ENDCLASS.

CLASS child2 DEFINITION INHERITING FROM parent CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS create
      RETURNING
        value(_ro_child) TYPE REF TO child2.
ENDCLASS.

CLASS parent IMPLEMENTATION.
  METHOD meth.
    WRITE: / who_am_i.
  ENDMETHOD.
ENDCLASS.

CLASS  child1  IMPLEMENTATION.
  METHOD create.
    CREATE OBJECT _ro_child.
    who_am_i = '1'.
  ENDMETHOD.
ENDCLASS.

CLASS  child2  IMPLEMENTATION.
  METHOD create.
    CREATE OBJECT _ro_child.
    who_am_i = '2'.
  ENDMETHOD.
ENDCLASS.


START-OF-SELECTION.

  DATA ref TYPE REF TO parent.

  ref = child1=>create( ).
  ref->meth( ).

  ref = child2=>create( ).
  ref->meth( ).
Суть в том, что статический метод CREATE, создающий экземпляр класса, выносится за интерфейс родительского класса


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

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


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

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


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

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