Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
Приведение типов родственных объектов https://zx.oberon.org/forum/viewtopic.php?f=79&t=393 |
Страница 1 из 1 |
Автор: | Len [ 04 июл 2018, 06:31 ] |
Заголовок сообщения: | Приведение типов родственных объектов |
В модуле ObxStores в конце процедуры WriteRead есть строчка m:=s(Node). Как я понимаю, это приведение объекта предка к потомку. Я написал два модуля но приведение получается (притом неявное) только от потомка к предку (модуль Mod2 метод Start), в обратную сторону - никак. Но почему это получилось в ObxStores? Код: "OBERON"
Код: "OBERON"
|
Автор: | ivan_denisov [ 04 июл 2018, 08:31 ] |
Заголовок сообщения: | Re: Приведение типов родственных объектов |
Вот для таких случаев это надо: Код: "OBERON"
|
Автор: | Len [ 04 июл 2018, 13:13 ] |
Заголовок сообщения: | Re: Приведение типов родственных объектов |
ivan_denisov писал(а): Вот для таких случаев это надо: Код: "OBERON"
Нет, к сожалению выдаёт ошибку во время выполнения. |
Автор: | SovietPony [ 04 июл 2018, 21:38 ] |
Заголовок сообщения: | Re: Приведение типов родственных объектов |
Падает потому что типы не совпадают. Да и в данном случае такое приведение типа бессмысленно. Поиграйся с такой процедуркой, внимательно посмотри на передаваемые параметры в Test: Код: "OBERON"
И вообще, почитай уже описание языка, что ли. |
Автор: | geniepro [ 06 июл 2018, 11:22 ] |
Заголовок сообщения: | Re: Приведение типов родственных объектов |
Len писал(а): В модуле ObxStores в конце процедуры WriteRead есть строчка m:=s(Node). Как я понимаю, это приведение объекта предка к потомку. Я написал два модуля но приведение получается (притом неявное) только от потомка к предку (модуль Mod2 метод Start), в обратную сторону - никак. Предка к потомку приводить нельзя, ведь в этом случае может произойти ошибка при попытке использования поля потомка у предка, у которого такого поля нет. А вот потомка использовать вместо предка можно. Это называется Принцип подстановки Лисков. Не изучал код этого ObxStores, но предполагаю, что там в качестве типа аргумента процедуры указан указатель на предка, передаётся туда адрес потомка, а потом этот потомок проверяется, что он -- действительно имеет тип потомка и производится явное преобразование к типу потомка. В таком случае ошибки при выполнении не должно быть... |
Автор: | Len [ 06 июл 2018, 15:39 ] |
Заголовок сообщения: | Re: Приведение типов родственных объектов |
geniepro писал(а): И вообще, почитай уже описание языка, что ли. Ты имеешь в виду документацию к ББ? Если её, то поясни где именно написано о приведении типов объектов. |
Автор: | SovietPony [ 06 июл 2018, 17:53 ] |
Заголовок сообщения: | Re: Приведение типов родственных объектов |
Help -> Contents -> Language Report Цитата: 8.1 Operands
... A type guard v(T) asserts that the dynamic type of v is T (or an extension of T), i.e., program execution is aborted, if the dynamic type of v is not T (or an extension of T). Within the designator, v is then regarded as having the static type T. The guard is applicable, if 1. v is an IN or VAR parameter of record type or v is a pointer to a record type, and if 2. T is an extension of the static type of v ... |
Автор: | Len [ 07 июл 2018, 04:48 ] |
Заголовок сообщения: | Re: Приведение типов родственных объектов |
Нашёл! Цитата: Охрана типа [type guard] v(T) удостоверяет, что динамический тип переменной v есть T (или потомок типа T), т.е. выполнение программы аварийно прекращается, если динамический тип переменной v не T (и не потомок T). Тогда внутри составного имени переменная v считается имеющей статический тип T. Охрана применима, если 1. v является IN или VAR параметром записевого типа или v является указателем на запись, и если 2. T является потомком статического типа переменной v Благодарю. |
Страница 1 из 1 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |