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: О наследовании: принцип подстановки и виртуальность |
Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП. Как со вторым вопросом? Вообще меня уже пару месяцев свербит написать что-то типа эссе: Почему я разлюбил С++. И вбросить это на РСДН... Основная мысль: два принципиально разных подхода в разработке языка 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: О наследовании: принцип подстановки и виртуальность |
Валерий Лаптев писал(а): Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП. Оберон тут не при чём. Невозможно передать в процедуру абстрактный объект по значению. Вообще невозможно, а не в Обероне невозможно. Доступ к полиморфным объектам всегда по указателю/ссылке осуществляется. Валерий Лаптев писал(а): Вообще меня уже пару месяцев свербит написать что-то типа эссе: Почему я разлюбил С++. И вбросить это на РСДН... Если в статье будет только про С++, но не будет про Оберон - да наздоровье, развлекайтесь сколько хотите. Но если Вы там про Оберон хотите упомянуть... то, как бы, есть просьба, прежде чем вбрасывать на РСДН сначала дайте нам почитать. Может что поправить посоветуем
|
Автор: | Trurl [ Среда, 10 Ноябрь, 2010 12:44 ] |
Заголовок сообщения: | Re: О наследовании: принцип подстановки и виртуальность |
Валерий Лаптев писал(а): Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП. На первый вопрос Оберон и КП отвечают по-разному. Цитата: мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа. В Обероне можем. |
Автор: | Валерий Лаптев [ Среда, 10 Ноябрь, 2010 16:18 ] |
Заголовок сообщения: | Re: О наследовании: принцип подстановки и виртуальность |
Сергей Губанов писал(а): Валерий Лаптев писал(а): Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП. Оберон тут не при чём. Невозможно передать в процедуру абстрактный объект по значению. Вообще невозможно, а не в Обероне невозможно. Доступ к полиморфным объектам всегда по указателю/ссылке осуществляется. Валерий Лаптев писал(а): Вообще меня уже пару месяцев свербит написать что-то типа эссе: Почему я разлюбил С++. И вбросить это на РСДН... Если в статье будет только про С++, но не будет про Оберон - да наздоровье, развлекайтесь сколько хотите. Но если Вы там про Оберон хотите упомянуть... то, как бы, есть просьба, прежде чем вбрасывать на РСДН сначала дайте нам почитать. Может что поправить посоветуем 1. Я про абстрактные классы не говорил. Я - про принцип подстановки. Ограничение в Обероне-КП: нельзя работать с объектами, а можно только с указателями и ссылками. 2. Само-собой... Тут кстати, тоже недавно пришла в голову мысль. Есть такие журналы: Компьютерные инструменты в образовании и Компьютерные инструменты в школе. Почему бы, например, Ермакову и/или Федору Василичу не написать туда статьи про ББ+КП. И Виталий Потопахин тоже может очень нужную статью написать. Вот и пойдет инфа в школы. Журналы достаточно интересные, там, например, Сафронов несколько статей напечатал, Шалыто и еще ряд менее известных товарисчей. Ы? |
Автор: | Валерий Лаптев [ Среда, 10 Ноябрь, 2010 16:19 ] |
Заголовок сообщения: | Re: О наследовании: принцип подстановки и виртуальность |
Trurl писал(а): Валерий Лаптев писал(а): Так, вроде с первым вопросом разобрались. Значит это один из тех краеугольных ограничений, которыми полон Оберон-КП. На первый вопрос Оберон и КП отвечают по-разному. Цитата: мы не можем писать процедуру с параметром-объектом базового типа, чтобы она обрабатывала объекты производного типа. В Обероне можем. Спасибо! |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |