Текущее время: Чт, июн 19 2025, 19:57

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Type ANY для классов
СообщениеДобавлено: Вт, июн 03 2008, 20:44 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Ср, ноя 01 2006, 22:58
Сообщения: 794
Откуда: Заарбрюкен
Пол: Мужской
Скажите, а есть ли возможность динамического создания класса в программе. Допустим есть несколько классов (наследники) от родителя и в программе надо динамически выбрать, какой из них использовать. Как можно это сделать? Что-то типа type any но только для классов.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Type ANY для классов
СообщениеДобавлено: Вт, июн 03 2008, 22:44 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Konstantin Anikeev написал:
Скажите, а есть ли возможность динамического создания класса в программе. Допустим есть несколько классов (наследники) от родителя и в программе надо динамически выбрать, какой из них использовать. Как можно это сделать? Что-то типа type any но только для классов.

Вроде, CREATE OBJECT поддерживает динамическое задание типа, т.е. когда имя типа задается полем. Есть еще оператор =? для присвоения с приведением типа. Так что должно получиться.

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июн 03 2008, 22:49 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Ср, ноя 01 2006, 22:58
Сообщения: 794
Откуда: Заарбрюкен
Пол: Мужской
Привет, Сергей,

это так, но для create object нужно указать объект создания, а потом уже его тип... Так вопрос в том, как объявить этот объект

DATA: lcl_any type ref to ????...

C родителями и потомками все легко... Задаешь тип родителя, для потомков он подходит... А вот как быть, ели родителя нету, просто набор классов...

Через интерфейсы пробовал, но знающие люди надавали по рукам со словами, что не для этого интерфейсы придуманы :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июн 03 2008, 23:41 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Konstantin Anikeev написал:
Через интерфейсы пробовал, но знающие люди надавали по рукам со словами, что не для этого интерфейсы придуманы :)

Костя, привет!
Дык можно через интерфейсы. В этом случае, всю кухню по выбору конкретного имени класса убирают в еще один класс "factory", который создает экземпляр нужного класса, а на выход выдает ссылку на интерфейс.

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 04 2008, 00:08 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Ср, ноя 01 2006, 22:58
Сообщения: 794
Откуда: Заарбрюкен
Пол: Мужской
У меня было два варианта.

1. Это объявление интерфейса и реализация этого интерфейса классами...

тогда

data: lcl_class type ref to INTERFACE

ну и соответственно

create object lcl_class type (class_name)

Собственно, такой подход используется в BADI... Но ведь по сути интерфейсы не для того служат. Ведь они-то, насколько я сам понимаю, в основном нужны в ABAP для множественного наследования (т.к. в стандарте этого не предусмотрено - класс может иметь только одного родителя). А вот интерфейсы позволяют использовать множественное наследование.

2. Объявление общего родителя

тогда

data: lcl_class type ref to PARENT_CLASS_NAME

и

create object lcl_class type (child_class_name)

Тоже работает, просто в потомках нужные методы расширяются...

Но знающие люди говорят, что есть еще и третий способ... И без имени интерфейса, и без класса-родителя... Вот только как это реализовывается (в силу дефицита времени) не рассказывают...

Оно и 1, и 2 способы работают, но есть ощущение какой-то недосказанности... :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 04 2008, 07:34 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Konstantin Anikeev написал:
Но ведь по сути интерфейсы не для того служат.
Именно для того!

Konstantin Anikeev написал:
Но знающие люди говорят, что есть еще и третий способ... И без имени интерфейса, и без класса-родителя... Вот только как это реализовывается (в силу дефицита времени) не рассказывают...

Если методы статические, то можно вызывать так (class_name)=>meth
или даже так (class_name)=>(meth_name).

Есть ещё, наверное, сложные способы, типа generate subroutine pool, которые объяснить действительно времени может не хватить. :)

Konstantin Anikeev написал:
Оно и 1, и 2 способы работают, но есть ощущение какой-то недосказанности...
Оба метода являются правильными. Наследовать методы или реализовывать интерфейсы — зависит от архитектуры системы классов: вдоль или поперёк.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 04 2008, 09:28 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Ср, ноя 01 2006, 22:58
Сообщения: 794
Откуда: Заарбрюкен
Пол: Мужской
sibrin написал:
Konstantin Anikeev написал:
Но знающие люди говорят, что есть еще и третий способ... И без имени интерфейса, и без класса-родителя... Вот только как это реализовывается (в силу дефицита времени) не рассказывают...

Если методы статические, то можно вызывать так (class_name)=>meth
или даже так (class_name)=>(meth_name).


Вот-вот-вот... по-моему клюет... Т.е. можно объявить

data: lcl_class_name type string

и потом

create object (lcl_class_name) type (class_type)

Сработает? Надо попробовать...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 04 2008, 09:47 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
а если попробовать сделать так:

data: ref type ref to object.

create object ref type (class_type).

ну и потом с использованием ?=

_________________
Я слышу и забываю,
Я вижу и помню долго,
Я делаю и — понимаю.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 04 2008, 09:47 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Konstantin Anikeev написал:
create object (lcl_class_name) type (class_type)
:shock: И куда попадёт результат?

Давайте определимся, чьи методы хотим вызывать: класса или экземпляра?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 04 2008, 09:52 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Lars написал:
а если попробовать сделать так:

data: ref type ref to object.

create object ref type (class_type).

ну и потом с использованием ?=

Ну а куда потом с использованием ?= делать сужение?
В ту же самую ссылку на интерфейс, что и у автора топика в п.1.
И нафига козе баян?

Аналогично можно и data: d type ref to data использовать :), а потом d->*->method. Но в любом случае, пока ссылка не типизирована, компилятор не позволит вызывать метод экземпляра. В противном случае, очевидно, была бы разрешена конструкция data: ref type ref to (class).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 04 2008, 10:10 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
sibrin написал:
Lars написал:
а если попробовать сделать так:

data: ref type ref to object.

create object ref type (class_type).

ну и потом с использованием ?=

Ну а куда потом с использованием ?= делать сужение?
В ту же самую ссылку на интерфейс, что и у автора топика в п.1.
И нафига козе баян?

Аналогично можно и data: d type ref to data использовать :), а потом d->*->method. Но в любом случае, пока ссылка не типизирована, компилятор не позволит вызывать метод экземпляра. В противном случае, очевидно, была бы разрешена конструкция data: ref type ref to (class).


Это, собственно, понятно. Вопрос в том, где это потом использовать и какаова цель. Мне казалось, что вопрос в том, как сделать ANY для класса.
А вопрос
Цитата:
И нафига козе баян?
индивидуален.

Такая вот штука работает, но без параметров:
Code:
data: ref type ref to object,
      ref_str type string VALUE 'ZCL_TEST',
      meth_str type string value 'TEST'.

create object ref type (ref_str).
call method ref->(meth_str).


А так с параметром:
Code:
data: ref type ref to object,
      ref_str type string VALUE 'ZCL_TEST',
      meth_str type string value 'TEST'.

create object ref type (ref_str).
call method ref->(meth_str) exporting i_param = '1'.


Видимо, если у классов будут одинаковые интерфейсы включены, это облегчет жизнь.
Или попробовать воспользоваться PARAMETER-TABLE для call method.

_________________
Я слышу и забываю,
Я вижу и помню долго,
Я делаю и — понимаю.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 04 2008, 12:38 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Lars написал:
Такая вот штука работает, но без параметров:
Code:
data: ref type ref to object,
      ref_str type string VALUE 'ZCL_TEST',
      meth_str type string value 'TEST'.

create object ref type (ref_str).
call method ref->(meth_str).

А вот это действительно вариант! Был неправ.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

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


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

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


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

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