Текущее время: Чт, май 09 2024, 10:13

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пт, янв 11 2013, 09:53 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2011, 11:48
Сообщения: 12
Откуда: Украина
Пол: Мужской
Существует ли способ определить является ли класс/инстанция наследником от другого(заданного) класса?

К примеру, в Delphi используется оператор is:
procedure TForm1.FormShow(Sender: TObject);
begin
if sender is TForm then
{ ... }
;
end;


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пт, янв 11 2013, 10:50 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3074
Откуда: Москва
gentle написал:
Существует ли способ определить является ли класс/инстанция наследником от другого(заданного) класса?

А зачем?
Если необходимо вызвать метод, который наследуется от предка, достаточно сделать CASTING.
Code:
Form call_parent_method using p_object type ref to class.
DATA: g_parent type ref to zcl_parent.

  g_parent ?= p_object.
  check g_parent is bound.
  call method g_parent->parent_method.
..
Endform.


Рекомендую изучить курс BC401.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пт, янв 11 2013, 11:26 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2011, 11:48
Сообщения: 12
Откуда: Украина
Пол: Мужской
Удав написал(а):
gentle написал:
Существует ли способ определить является ли класс/инстанция наследником от другого(заданного) класса?

А зачем?


Для использования [s]полиморфного[/s] специфического поведения наследников.

Подклассы одного родителя могут иметь свои _дополнительные_ методы.
Чтобы их(дополнительные методы) вызвать нужно уточнить принадлежность переданной инстанции (как ссылку на общий класс) к конкретному классу.


Последний раз редактировалось gentle Пт, янв 11 2013, 12:43, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пт, янв 11 2013, 11:34 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1247
2 gentle: Как мне кажется, подобный подход как раз противоречит полиморфному принципу и принципам ООП об инкапсуляции. Получается, что тот класс\метод\софт в котором вы хотите это делать должен слишком много знать о других классах.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пт, янв 11 2013, 11:42 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2011, 11:48
Сообщения: 12
Откуда: Украина
Пол: Мужской
2 Кодер: Обсуждение принципов ООП можно оформить в отдельную тему.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пт, янв 11 2013, 11:45 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3074
Откуда: Москва
gentle написал:
Хотелось бы просто получить ответ на конкретный вопрос, указанный в данной теме.

Ответ я уже дал.
По поводу полиморфизма - это как раз возможность вызывать методы наследников, интерфейс которых определен в родителе.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пт, янв 11 2013, 12:34 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 347
gentle написал:
Существует ли способ определить является ли класс/инстанция наследником от другого(заданного) класса?
Какого-то конкретного оператора нет. Можно наваять что-то свое, используя, например, методы класса CL_ABAP_CLASSDESCR.
gentle написал:
Для использования полиморфного поведения наследников. Подклассы одного родителя могут иметь свои _дополнительные_ методы. Чтобы их(дополнительные методы) вызвать нужно уточнить принадлежность переданной инстанции (как ссылку на общий класс) к конкретному классу.
gentle написал:
К примеру, в Delphi используется оператор is:
procedure TForm1.FormShow(Sender: TObject);
begin
if sender is TForm then
{ ... }
;
end;
Хотя Вы, судя по всему, склонны сделать по-своему :), присоединюсь к критике Кодера и Удава. Это [не совсем/совсем не] полиморфизм. И при таком подходе у Вас появится сильная связанность (coupling) классов. Имхо, лучше использовать паттерн метод шаблона (template method).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пт, янв 11 2013, 12:50 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
Вот тут автор размышляет над 'IS INSTANCE OF', и заодно у него там есть пример как это выглядит на абапе

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пт, янв 11 2013, 15:12 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2011, 11:48
Сообщения: 12
Откуда: Украина
Пол: Мужской
Благодарю за полезные советы и ссылки!
:)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пн, янв 14 2013, 03:46 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Кодер написал(а):
2 gentle: Как мне кажется, подобный подход как раз противоречит полиморфному принципу и принципам ООП об инкапсуляции. Получается, что тот класс\метод\софт в котором вы хотите это делать должен слишком много знать о других классах.


А по моему это вполне стандартная операция в ООП. Тот же класс CL_ABAP_TYPEDESCR имеет такую структуру наследников:

Code:
CL_ABAP_TYPEDESCR
  |
    |--CL_ABAP_DATADESCR
  |     |
  |    |--CL_ABAP_ELEMDESCR
   |    |--CL_ABAP_REFDESCR
   |    |--CL_ABAP_COMPLEXDESCR
  |         |
  |         |--CL_ABAP_STRUCTDESCR
  |         |--CL_ABAP_TABLEDESCR
  |
  |--CL_ABAP_OBJECTDESCR
       |
       |--CL_ABAP_CLASSDESCR
       |--CL_ABAP_INTFDESCR


В документации пример:

Code:
REPORT typedescr_test.

CLASS c01 DEFINITION.
  PUBLIC SECTION.
    DATA:
      my_float type f,
      my_int   type i.
ENDCLASS.

DATA:
  descr_ref_class TYPE REF TO cl_abap_classdescr,
  descr_ref_attr  TYPE REF TO cl_abap_typedescr.

FIELD-SYMBOLS:
  <attr_wa> TYPE abap_attrdescr.

START-OF-SELECTION.
  descr_ref_class ?= cl_abap_typedescr=>describe_by_name( 'C01' ).
  WRITE: / 'Class', descr_ref_class->absolute_name,
           'has following attribute definitions:'.
  LOOP AT descr_ref_class->attributes ASSIGNING <attr_wa>.
    descr_ref_attr ?=
      descr_ref_class->get_attribute_type( <attr_wa>-name ).
    WRITE: / <attr_wa>-name, 'TYPE',
             descr_ref_attr->absolute_name.
  ENDLOOP.



Получается мы приводим ссылку к более специфическому классу чтобы получить более специфическую информацию. (cl_abap_typedescr=>describe_by_name( 'C01' ) возвращает объект типа CL_ABAP_TYPEDESCR)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пн, янв 14 2013, 08:00 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1247
2 AFH: Ага, все правильно. В приведенном Вами коде, клиентское приложение твердо знает, что на вход cl_abap_typedescr подали именно класс, а не гадает на ромашке "а не класс ли это?". И уж тем более не гадает "а не класс ли это. у которого в предках вот такой вот класс-родитель?"

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пн, янв 14 2013, 09:10 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
2 Кодер
Я это написал к тому что есть мнение:
gentle написал:
Подклассы одного родителя могут иметь свои _дополнительные_ методы.
Чтобы их(дополнительные методы) вызвать нужно уточнить принадлежность переданной инстанции (как ссылку на общий класс) к конкретному классу.
Кодер написал(а):
Как мне кажется, подобный подход как раз противоречит полиморфному принципу и принципам ООП об инкапсуляции. Получается, что тот класс\метод\софт в котором вы хотите это делать должен слишком много знать о других классах.



С которым я немножко не согласен :) Хотя можт быть я неправильно уловил суть обсуждения.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пн, янв 14 2013, 10:11 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 347
2 AFH.
Приведенный Вами пример немножко отличается от того, что хотел реализовать (уже реализовал? :)) топикстартер.
В примере метод класса каким-то образом (для внешней программы неважно каким) определяет, ссылку на объект какого конкретного класса нужно вернуть. Внешняя программа знает, что она должна получить, и преобразовывает ссылку на объект родительского класса к ссылке на объект нужного дочернего. И только потом уже использует специфические методы. Т.е. вызовом специфических методов занимается внешний код, который знает, с чем конкретно он работает. А не "внутренний" код, который просто создает нужный объект и возвращает ссылку на него.
Топикстартер хотел реализовать логику, когда вызов специфических методов осуществляется "внутри". Т.е. "внутрь" приходит ссылка на хз-что, и "внутренний" код самостоятельно разбирается, что это такое, и какие методы он может вызывать.
Может, это и не нарушение принципов ООП (фактически, при такой логике полиморфизм просто не используется или используется не везде), но, имхо, неудачный подход: при любых изменениях в иерархии, к которой принадлежит TForm1, придется анализировать и, возможно, править код FormShow. А если таких FormShow еще и несколько, при малейшем изменении иерархии появляется риск получить полную гамму малоприятных сексуальных удовольствий.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пн, янв 14 2013, 11:54 
Начинающий
Начинающий
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2011, 11:48
Сообщения: 12
Откуда: Украина
Пол: Мужской
Итак, подводя итоги обсуждения, для реализации поставленной задачи был получен нижеследующий код(в первом приближении):

Code:
Method IsDescendantOf .
    " importing instance        type ref to object
    "           parentClassName type string
    "returning value(IsDescendant) type abap_Bool
data:
   ClassDsrb type ref to cl_abap_ClassDescr,
   ClassName type string,
   SuperClassDsrb type ref to cl_abap_TypeDescr.
"----------------------------------------------

   IsDescendant = abap_false.

   " описание класса инстанции, переданой как вх. параметр - instance
   ClassDsrb ?= cl_abap_typedescr=>describe_by_object_ref( instance ).

   while parentClassName <> classDsrb->get_relative_name( ).

         " пытаемся получить описание суперкласса
         call method ClassDsrb->get_super_class_type
              receiving  P_DESCR_REF = SuperClassDsrb
              exceptions SUPER_CLASS_NOT_FOUND = 2.

         if sy-subrc = 2. "SUPER_CLASS_NOT_FOUND
            exit.         " больше нет классов в иерархии наследования
         endif.

         free ClassDsrb.
         ClassDsrb ?= SuperClassDsrb.
   endWhile.

   " Сейчас classDsrb указывает на описание класса с именем:
   " parentClassName( если найден суперкласс ) или Object(если суперкласс НЕ найден )
   if parentClassName = classDsrb->get_relative_name( ).
      IsDescendant = abap_true.
   endif.

   free ClassDsrb.

endMethod.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить является ли некоторый класс наследником указанного класса?
СообщениеДобавлено: Пн, янв 14 2013, 12:39 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 347
Кажется, работает :). Только не учитывает реализацию (implementation) интерфейсов.


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

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


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

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


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

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