Текущее время: Чт, мар 28 2024, 14:05

Часовой пояс: 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
Сообщения: 1246
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
Сообщения: 1246
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 часа


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

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


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

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