Текущее время: Сб, авг 02 2025, 14:52

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


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

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


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

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