OberonCore
https://forum.oberoncore.ru/

О наследовании: принцип подстановки и виртуальность
https://forum.oberoncore.ru/viewtopic.php?f=29&t=2980
Страница 1 из 1

Автор:  Валерий Лаптев [ Вторник, 09 Ноябрь, 2010 10:19 ]
Заголовок сообщения:  О наследовании: принцип подстановки и виртуальность

Посмотрел все темы в этом разделе и не могу найти явные ответы на некоторые вопросы.
1. В КП определен общий базовый тип ANYREC и соответственно, указатель на общий базовый тип ANYPTR.
Таким образом, должен работать принцип подстановки Лисков: на место объекта базового типа может быть подставлен объект производного типа.
В сообщении о языке при описании оператора with обнаруживаем следующее описание, косвенно подтверждающее наличие принципа подстановки:
Цитата:
Åñëè v — ïàðàìåòð-ïåðåìåííàÿ òèïà çàïèñåé èëè óêàçàòåëüíàÿ ïåðåìåííàÿ, è åñëè åå ñòàòè÷åñêèé òèï T0, òî çíà÷åíèå îïåðàòîðà

WITH v: T1 DO S1 | v: T2 DO S2 ELSE S3 END

òàêîâî: åñëè äèíàìè÷åñêèì òèïîì ïåðåìåííîé v îêàçàëñÿ T1, òî âûïîëíÿåòñÿ îïåðàòîðíàÿ ïîñëåäî­âà­òåëüíîñòü S1, â êîòîðîé v ðàññìàòðèâàåòñÿ êàê åñëè áû åå ñòàòè÷åñêèì òèïîì áûë T1; â ïðîòèâíîì ñëó÷àå åñëè äèíàìè÷åñêèì òèïîì v îêàçàëñÿ T2, òî âûïîëíÿåòñÿ S2, â êîòîðîé v ðàññìàòðèâàåòñÿ êàê åñëè áû åå ñòàòè÷åñêèì òèïîì áûë T2; â ïðîòèâíîì ñëó÷àå âûïîëíÿåòñÿ S3. T1 è T2 äîëæíû áûòü ïîòîìêàìè òèïà T0.

О-па! Как сие исправить? Это текст из русской справки. Выставить в справке другой шрифт? У меня win 2000 сейчас.

Но суть в том, что выполняется та ветка, в которой динамический тип переменной v совпадает с прописанным типом: t1 или t2. А если не совпадает, то выполняется ветка else.
Однако в приложении А совместимость по присваиванию определена только для указательных типов.
Явно об этом нигде не написано, но получается, что для объектов типа записей принцип подстановки не выполняется, а выполняется только для указателей на записи.
Второе. Значит ли это, что в операторе with можно задавать только указатели, а не сами объекты? Получается именно так.
Если это так, то понятно почему в КП нигде не упоминается и срезке, когда на место объета базового типа подставляется объект производного типа с новыми полями, которых нет в базовом.
Это же самое означает, что мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа. Можно передавать только базовый указатель.
2. В С++ есть два способа для работы с типами во время исполнения: RTTI и виртуальность.
Как я понимаю, оператор with является неким аналогом RTTI - явные проверки динамического типа. Во всех учебниках по С++ написано, что желательно RTTI не использовать, поскольку есть виртуальные функции. Да я сам писал об этом.
По некоторым постам и текстам получается, что виртуальность в КП есть. Например, v.method() - вызывается метод по динамическому типу v, а не по статическому. Или это не так? v тогда должен быть указателем на базовый тип.

Автор:  Сергей Губанов [ Вторник, 09 Ноябрь, 2010 12:48 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Валерий Лаптев писал(а):
мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа
Вы это только сейчас узнали?

Автор:  Илья Ермаков [ Вторник, 09 Ноябрь, 2010 13:34 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Валерий Лаптев писал(а):
Это же самое означает, что мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа. Можно передавать только базовый указатель.


Или ссылку!!! VAR/IN rec: ANYREC - пожалуйста...

Автор:  Geniepro [ Вторник, 09 Ноябрь, 2010 13:41 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Ну логично -- если попробовать передать по значению вместо объекта базового типа объект производного типа, то произойдёт обрезка объекта, и мало ли какие баги в результате произойдут. Только по ссылке/указателю передавать...

Автор:  Валерий Лаптев [ Вторник, 09 Ноябрь, 2010 20:32 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП.
Как со вторым вопросом?

Вообще меня уже пару месяцев свербит написать что-то типа эссе: Почему я разлюбил С++.
И вбросить это на РСДН... :mrgreen:

Основная мысль: два принципиально разных подхода в разработке языка
1. Все, что не запрещено явно - разрешено (С++);
2. Все, что не разрешено явно - запрещено (Оберон-КП);

Должен сказать, что с точки зрения обучения мне второй подход за последние полтора-два года стал гораздо ближе... :)
Я уже на лекциях обращаю внимание студиозов на "передоз" сложности С++ в некоторых местах (не говоря уже о шаблонах) :)

Дык как со вторым вопросом?

И еще конкретно Илью прошу разъяснить термин "родовая шина сообщений".
Достаточно привести намеки на аналоги - я пойму.

Автор:  Info21 [ Вторник, 09 Ноябрь, 2010 20:54 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Валерий Лаптев писал(а):
прошу разъяснить термин "родовая шина сообщений".
Там перевод дикий: "общая шина сообщений". Или "шина общих сообщений".

А разъясняет пусть конкретно И.Е. :)

Автор:  Валерий Лаптев [ Вторник, 09 Ноябрь, 2010 20:57 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Собственно не совсем понятен термин "шина сообщений". Я, наверное, слишком конкретный, но мне так и представляется некий объект в виде трубы :), куда все объекты "сливают" сообщения (вызовы методов)... :)

Автор:  Александр Ильин [ Вторник, 09 Ноябрь, 2010 21:01 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Валерий Лаптев писал(а):
Собственно не совсем понятен термин "шина сообщений". Я, наверное, слишком конкретный, но мне так и представляется некий объект в виде трубы :), куда все объекты "сливают" сообщения (вызовы методов)... :)
Так и есть, только вместо трубы - метод объекта с названием Handle(VAR msg: TMessage). По сути, тип конкретного экземпляра msg - это имя метода, а содержимое записи msg - переданные в метод параметры.

Автор:  Валерий Лаптев [ Вторник, 09 Ноябрь, 2010 21:05 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Это в каком модуле прописано?

Автор:  Александр Ильин [ Вторник, 09 Ноябрь, 2010 21:19 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Валерий Лаптев писал(а):
Это в каком модуле прописано?
Это общий подход к организации. В любом объекте создаём такой метод, а в наследниках этого объекта переопределяем процедуру Handle и добавляем наследников TMessage. Вообще, в учебнике же это есть. См. Wirth N. Programming In Oberon: Steps Beyond Pascal and Modula, глава 12, раздел 12.5 "Message and handlers".

Автор:  Валерий Лаптев [ Вторник, 09 Ноябрь, 2010 21:32 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Ага, в этот учебник я не заглядывал... :)
Спасибо, посмотрю.

Автор:  Илья Ермаков [ Вторник, 09 Ноябрь, 2010 21:46 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Ещё: http://oberoncore.ru/articles/start - "Некоторые идеи архитектуры Оберон-систем".

P.S. А перевод термина я когда-то унаследовал с вологодского сайта...

Автор:  Info21 [ Вторник, 09 Ноябрь, 2010 23:16 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Александр Ильин писал(а):
только вместо трубы - метод объекта с названием Handle(VAR msg: TMessage).
Не вполне верно.
Труба, это, скорее, тот, обычно закадровый механизм раздачи сообщений.

Только почему труба.
Вроде бы с обычной электрической шиной прямая аналогия, к которой (шине) подключают устройства.
И уж скорее не труба, а коридор со многими дверями.

Автор:  Сергей Губанов [ Среда, 10 Ноябрь, 2010 12:03 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Валерий Лаптев писал(а):
Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП.
Оберон тут не при чём. Невозможно передать в процедуру абстрактный объект по значению. Вообще невозможно, а не в Обероне невозможно. Доступ к полиморфным объектам всегда по указателю/ссылке осуществляется.
Валерий Лаптев писал(а):
Вообще меня уже пару месяцев свербит написать что-то типа эссе: Почему я разлюбил С++. И вбросить это на РСДН...
Если в статье будет только про С++, но не будет про Оберон - да наздоровье, развлекайтесь сколько хотите. Но если Вы там про Оберон хотите упомянуть... то, как бы, есть просьба, прежде чем вбрасывать на РСДН сначала дайте нам почитать. Может что поправить посоветуем :roll:

Автор:  Trurl [ Среда, 10 Ноябрь, 2010 12:44 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Валерий Лаптев писал(а):
Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП.

На первый вопрос Оберон и КП отвечают по-разному.

Цитата:
мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа.

В Обероне можем.

Автор:  Валерий Лаптев [ Среда, 10 Ноябрь, 2010 16:18 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Сергей Губанов писал(а):
Валерий Лаптев писал(а):
Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП.
Оберон тут не при чём. Невозможно передать в процедуру абстрактный объект по значению. Вообще невозможно, а не в Обероне невозможно. Доступ к полиморфным объектам всегда по указателю/ссылке осуществляется.
Валерий Лаптев писал(а):
Вообще меня уже пару месяцев свербит написать что-то типа эссе: Почему я разлюбил С++. И вбросить это на РСДН...
Если в статье будет только про С++, но не будет про Оберон - да наздоровье, развлекайтесь сколько хотите. Но если Вы там про Оберон хотите упомянуть... то, как бы, есть просьба, прежде чем вбрасывать на РСДН сначала дайте нам почитать. Может что поправить посоветуем :roll:

1. Я про абстрактные классы не говорил. Я - про принцип подстановки. Ограничение в Обероне-КП: нельзя работать с объектами, а можно только с указателями и ссылками.
2. Само-собой... :) Тут кстати, тоже недавно пришла в голову мысль. Есть такие журналы: Компьютерные инструменты в образовании и Компьютерные инструменты в школе. Почему бы, например, Ермакову и/или Федору Василичу не написать туда статьи про ББ+КП. И Виталий Потопахин тоже может очень нужную статью написать. Вот и пойдет инфа в школы. Журналы достаточно интересные, там, например, Сафронов несколько статей напечатал, Шалыто и еще ряд менее известных товарисчей.
Ы?

Автор:  Валерий Лаптев [ Среда, 10 Ноябрь, 2010 16:19 ]
Заголовок сообщения:  Re: О наследовании: принцип подстановки и виртуальность

Trurl писал(а):
Валерий Лаптев писал(а):
Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП.

На первый вопрос Оберон и КП отвечают по-разному.
Цитата:
мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа.

В Обероне можем.

Спасибо!

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/