Текущее время: Вт, июл 22 2025, 01:14

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


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

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


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

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