Текущее время: Вс, июл 27 2025, 21:18

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Тонкости widening cast и narrowing cast
СообщениеДобавлено: Пн, мар 11 2013, 15:32 
Ассистент
Ассистент

Зарегистрирован:
Вс, дек 09 2012, 16:41
Сообщения: 37
1 DATA:
2 lo_vehicle TYPE REF TO cl_vehicle,
3 lo_bus TYPE REF TO cl_bus,
4 lo_truck TYPE REF TO cl_truck,
5 v_cargo TYPE s_plan_car .

6 START-OF-SELECTION.

7 * At first create instance of BUS
8 CREATE OBJECT lo_bus
9 EXPORTING
10 im_make = 'Iveco' " Марка автобуса
11 im_passengers = 56. " Кол-во пассажиров
12* Secondly create instance of TRUCK
13 CREATE OBJECT lo_truck
14 EXPORTING
15 im_cargo = 15 " Грузоподъемность
16 im_make = 'Man'. " Марка грузовика
17 * Assign BUS instance to VEHICLE object reference
18 lo_vehicle = lo_bus.

19 * Try Assign back
20 * lo_bus = lo_vehicle. " Bad syntax
21 * And now
22 lo_bus ?= lo_vehicle. " Good

23 CALL METHOD lo_bus->display_attributes.

24 * Try it for TRUCK
25 * lo_truck ?= lo_vehicle. " Good syntax check
26 * But !? Try to execute after uncommenting previous row

27* And uncomment and try now
28 TRY .
29 lo_truck ?= lo_vehicle.
30 CATCH cx_sy_move_cast_error.
31 message e000(zbc) with 'You get this message from CATCH block'.

32 ENDTRY.

Здравствуйте. Не до конца разобрался с особенностями narrowing и widening cast. Есть исходный код, где создаются инстанции классов, являющиеся учебными глобальными классами модуля BC401.

В строке 22 мы статической переменной lo_bus (кстати, что мы называем статической переменной? в строке 8 создана инстанция, и ссылочная переменная указывает на какую-то конкретную область памяти... то есть, исходя из теории, lo_bus уже динамический тип... то есть получается, что мы динамическому типу присваиваем динамический тип?.. в чем здесь логика? ) присваеваем ссылку на динамический тип lo_vehicle. Получается что:

1) если бы статический тип ссылки lo_bus был более детальный, чем динамический тип lo_vehicle, то при данном синтаксисе ( lo_bus ?= lo_vehicle) система бы упала в дамп?

2) в строке 29 присвоения не происходит, так как переменные "разные по типу" (система падает в дамп)... вопрос: что в данном случае подразумевается под словосочетанием "разные по типу" и почему, в таком случае, система не упала в дамп на 22 строке... расшифруйте, пожулуйста...


Спасибо большое!


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Тонкости widening cast и narrowing cast
СообщениеДобавлено: Пн, мар 11 2013, 16:14 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
если ничего не путаю и ничего не изменилось с 4.7, то:

в операторе `?=` ссылка на объект не изменяется, производится как-бы доступ к ссылке,
по разграничениям заданного слева типа (класса/интерфейса).
можно привести к вышестоящему классу/интерфейсу снизу-вверх, и нельзя приводить сверху-вниз.

в примере 2)
Code:
18 lo_vehicle = lo_bus.   " в lo_vehicle несмотря на тип cl_vehicle хранится ссылка на объект cl_bus, приведение снизу-вверх
29 lo_truck ?= lo_vehicle.  " попытка привести cl_bus к cl_truck - не сработает; также не сработает, если в lo_vehicle хранится cl_vehicle, т.к. нельзя приводить сверху-вниз


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Тонкости widening cast и narrowing cast
СообщениеДобавлено: Пн, мар 11 2013, 22:41 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 351
juventine написал(а):
кстати, что мы называем статической переменной?
По-видимому, речь идет о раннем связывании.
juventine написал(а):
...lo_bus уже динамический тип... то есть получается, что мы динамическому типу присваиваем динамический тип?.. в чем здесь логика?
Есть декларируемый тип переменной, известный компилятору, а есть реальный тип, который используется во время выполнения программы. Например, lo_vehicle TYPE REF TO cl_vehicle - до запуска программы (на этапе компиляции) компилятор знает, что у Вас ссылка на cl_vehicle. Но во время работы программы это может быть ссылка на любой класс-потомок cl_vehicle. Аналогия. Вы знаете, что Вам подарят автомобиль, и можете готовиться к этому (этап компиляции, точнее даже - написания программы, которая потом будет компилироваться) - подыскивать гараж, получать права и т.д. А подарили (этап выполнения) Вам "Запорожец" - т.е. не просто автомобиль (как и ожидалось на этапе компиляции), а автомобиль с какими-то дополнительными свойствами или отсутствием оных ;) (дочерний класс).
juventine написал(а):
если бы статический тип ссылки lo_bus был более детальный, чем динамический тип lo_vehicle, то при данном синтаксисе ( lo_bus ?= lo_vehicle) система бы упала в дамп?
Не знаю, что имеется в виду под словом "детальный". Если во время выполнения lo_vehicle - не ссылка на класс lo_bus или на его потомка, будет дамп.
juventine написал(а):
что в данном случае подразумевается под словосочетанием "разные по типу"...
Видимо, из разных иерерахий классов.
juventine написал(а):
почему, в таком случае, система не упала в дамп на 22 строке...
Видимо, в строке 29 ссылки на объекты из разных иерархий классов, в 22 -нет.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тонкости widening cast и narrowing cast
СообщениеДобавлено: Пн, мар 11 2013, 22:48 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 351
trop написал(а):
можно привести к вышестоящему классу/интерфейсу снизу-вверх, и нельзя приводить сверху-вниз.
[s]Почему нельзя?[/s]
UPD. Был невнимателен.
Code:
CLASS lcl_base DEFINITION. ...
CLASS lcl_child DEFINITION INHERITING FROM lcl_base. ...
CLASS lcl_child2 DEFINITION INHERITING FROM lcl_child. ...
...
DATA: ref_base TYPE REF TO lcl_base.
DATA: ref_child TYPE REF TO lcl_child.

CREATE OBJECT ref_child TYPE lcl_child2.
ref_base = ref_child.      " можно
ref_base ?= ref_child.     " тоже можно
...
CREATE OBJECT ref_base TYPE lcl_child2.
ref_child ?= ref_base.     " тут уже только так


Последний раз редактировалось LAT Вт, мар 12 2013, 20:21, всего редактировалось 1 раз.

Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тонкости widening cast и narrowing cast
СообщениеДобавлено: Пн, мар 11 2013, 23:20 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
угадай с 3 раз


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Тонкости widening cast и narrowing cast  Тема решена
СообщениеДобавлено: Вт, мар 12 2013, 20:21 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 351
А, там речь о рантайм. Сорри, исправился.


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

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


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

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


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

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