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

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


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

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


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

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