OberonCore https://forum.oberoncore.ru/ |
|
Как правильно создавать объекты? https://forum.oberoncore.ru/viewtopic.php?f=29&t=2134 |
Страница 1 из 2 |
Автор: | Виталий [ Понедельник, 30 Ноябрь, 2009 08:06 ] |
Заголовок сообщения: | Как правильно создавать объекты? |
Вот в Делфи если я хочу создать экземпляр класса я пишу Переменка:=Класс.Create. А как в обероне такое делается? Вот для создания модели я пишу: Код: MODULE Ev; TYPE Tt*=POINTER TO ABSTRACT RECORD Str:ARRAY(10) OF CHAR; END; VAR t*:Tt; PROCEDURE (v:Tt) Set*(IN s:ARRAY OF CHAR),NEW; BEGIN ASSERT(LEN(s)<=10); v.Str:=s$; END Set; PROCEDURE (v:Tt) Get*(OUT s:ARRAY OF CHAR),NEW; BEGIN ASSERT(LEN(s)<=10); s:="Строка+"+v.Str$; END Get; PROCEDURE do*; VAR a:Tt; BEGIN t.Set("123"); END do; END Ev. Естесственно t =NIL Так вот вопрос - как этот t создать. NEW не помогает ибо ABSTRACT. |
Автор: | Валерий Лаптев [ Понедельник, 30 Ноябрь, 2009 08:44 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Объекты абстрактных записей создавать нельзя. Это в любом языке. Либо уберите абстрактность, либо отнаследуйтесь от абстрактной в конкретную запись. |
Автор: | Виталий [ Понедельник, 30 Ноябрь, 2009 09:40 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
А-а-а. Все ясно. Странно мне попадались примеры где почему то ABSTRACT именно создавался, может я просто не все видел... Спасибо. |
Автор: | Valery Solovey [ Понедельник, 30 Ноябрь, 2009 11:57 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Он там не создавался, а использовался. Создавался не он, а его потомок где-то в другом месте. Потомок может использовться всюду, где может использоваться его родитель. Наверное, через параметры внутрь процедуры, в которой среди множества параметров указана переменная с типом = предок, передаётся потомок. Внутри процедуры работа с объектом ведётся как с предком. Даже если у предка используемые методы были абстрактными, у конечного потомка они уже оконкречены, поэтому всё работает. |
Автор: | Galkov [ Понедельник, 30 Ноябрь, 2009 12:02 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
И все это называется полиморфизм, без понимания его устройства ![]() Бедные дети... ![]() |
Автор: | Valery Solovey [ Понедельник, 30 Ноябрь, 2009 12:12 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Вот сказали Вы "полиморфизм" и сразу стало всё понятно? Нам это умное слово говорили в университете, и много чего ещё такого же бесполезного. Смысл в этом слове появляется только после того, как объяснена вся остальная система, в которой оно используется. |
Автор: | Виталий [ Понедельник, 30 Ноябрь, 2009 13:19 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Да ладно вам спорить... про полиморфизм мне извесно настолько насколько я его использую. Я просто думал что в обероне по другому как-то работа с объектами идет. Вот например TextModels.dir.New() Полез в исходники а там: Код: Directory* = POINTER TO ABSTRACT RECORD attr-: Attributes END; И никаких New... В общем и решил что тут по другому. Ну это я только потом узнал что методы класса тут по другому объявляются: Код: PROCEDURE (d: Directory) New* (): Model, NEW, ABSTRACT;
|
Автор: | Galkov [ Понедельник, 30 Ноябрь, 2009 14:34 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Valery Solovey писал(а): Вот сказали Вы "полиморфизм" и сразу стало всё понятно? Дык я и говорю, что нет ![]() Типа, если русскому человеку скажут, что надо снизить скорость, то ему это будет непонятно. Пока не скажут ПОЧЕМУ. Ну, скажем, впереди лежачий полицейский... А кирпич - потому-что дальше мост разобран ![]() Вспоминаю, как я тупо лбом бился об эти вопросы... Пока не подсел на конкретику. Ну, скажем, есть подпрограмма сортировки массива из каких-нибудь объектов. Которой очень надо для работы подпрограмка сравнения двух объектов. Если объекты конкретные - все ясно, вот она подпрограммка, вставляем ее, и нет проблем. И знание/понимание появляется после того, когда осознаешь тот факт, что основную программу можно написать не зная, где лежит эта подпрограмма сравнения, и какая она вообще. Называется косвенный функциональный вызов: кто-то поставил в какую-то ячейку нужный адрес подпрограмки, все начало работать. Подставили адрес другого алгоритма сравнения - работает уже по-другому. Ничего не подставил (это и есть абстракт) - нельзя и запускать. После такого у меня в мозгу и произошло "просветление", установилась точная ассоциативная связь между буржуинским словом полиморфизм, и тем, что реально происходит. И дурацкие вопросы, почему нельзя создавать абстракты - перешли из разряда священных мантр, в разряд очевидных логических выводов. То есть, тут для понимания нужно в мозгу четко держать факт, что у некого класса есть основной метод, который пользуется некоторыми виртуальными методами, которых на самом деле еще нет. И этот же метод есть автоматически у всех наследников этого класса, которые определили эти, ранее неведомые, виртуальные методы. И вот только в экземплярах этих наследников этот основной метод и используется, хотя и написан для предка. И дает эдакий полиморфный (разный для разных наследников) результат, при том, что написан был всего лишь один раз. И жалко детей, котором дают это так же, как нам давали политэкономию социализма - на уровне священных мантр. Так - ЗЯ, а так - НИЗЯ, потому-что противоречит некой концепции, до которой ты еще не дорос ![]() |
Автор: | Илья Ермаков [ Понедельник, 30 Ноябрь, 2009 14:41 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Вот только сегодня объяснял связанные процедуры и виртуальные вызовы. Параллельно и прикладным образом (показывая конкретный пример), и "технарски" - рисуя, как именно вводится косвенность вызова. (Когда указатели и структура памяти программы уже разобрана - куча, теги типов.., то всё легко). Т.е. "переменность" вызываемой операции. |
Автор: | Иван Кузьмицкий [ Понедельник, 30 Ноябрь, 2009 20:55 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Когда я проектирую абстрактный класс и его использование, я вовсе не задумываюсь о таблицах виртуальных методов, ячейках, атомах и прочих молекулах. Это уровень технической реализации, а я отталкиваюсь от словаря проблемной области. И тут абстрактный класс необходим именно как абстрактный, не имеющий "физического" воплощения. Воплощение происходит в конкретных наследниках. Поэтому для меня в данном контексте невозможность создания экземпляра абстрактной сущности совершенно естественно выглядит. Потому что это понятие выражается не в терминах адресов и ячеек, а в терминах когнитивных процессов. |
Автор: | Илья Ермаков [ Понедельник, 30 Ноябрь, 2009 21:02 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Не забывайте, что Вы всё это уже знаете. И об этом не думаете. Вы же не думаете о том, как устроен холодильник или видеомагнитофон, когда ими пользуетесь. Но имеется таки принципиальная разница - не думаете Вы, зная, или не задумывается современных школьник, не зная. Во многих случаях эта разница даёт о себе знать. |
Автор: | Galkov [ Понедельник, 30 Ноябрь, 2009 21:22 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Ну если уж совсем не думать про устройство холодильника, то можно предположить, что им можно охладить комнату, если открыть дверцу. При этом, у тех кто тоже не думает (но потому-что давно знает) встают дыбом волосы от таких предположений. Хоть и не каждый день встают, но от такого шока ведь не сразу отходишь ![]() P.S. Вот, блин, написал, и стал бояться - вдруг придется разъяснять почему "комнату не охладишь" |
Автор: | Илья Ермаков [ Понедельник, 30 Ноябрь, 2009 21:25 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
С точки зрения Мин. обр. это несущественно для выращивания "грамотного потребителя" (С) Фурсенко. |
Автор: | Galkov [ Понедельник, 30 Ноябрь, 2009 21:43 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Илья, Вы хотите, чтобы я совсем застрелился с тоски ??? Не дождетесь ![]() |
Автор: | Илья Ермаков [ Понедельник, 30 Ноябрь, 2009 21:49 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Не надо, патроны стоит поберечь. ![]() |
Автор: | Иван Кузьмицкий [ Понедельник, 30 Ноябрь, 2009 21:56 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
А я и не говорю, что про тонкости технической платформы не надо знать. Я про то, что рассуждения, например, об абстрактном классе, необходимо вести с двух позиций - не токмо с "атомно-молекулярной", но и с системной. |
Автор: | Илья Ермаков [ Понедельник, 30 Ноябрь, 2009 22:22 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Ну так именно так. ![]() |
Автор: | Galkov [ Вторник, 01 Декабрь, 2009 14:18 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Даже удивительно... Народ почему-то считает фундаментальным некое абстрактное определение (причем оно может быть разным на разных языках). А про этот злополучный "косвенный функциональный вызов" считается знать опасным по той причине, ![]() ![]() Не намного умнее, между прочим, чем "охладить комнату холодильником". Хоть обижайтесь, хоть нет - уровень понимания примерно один. Ну предположим такую дикость: выпустили процессор БЕЗ возможности "косвенного функционального вызова" ((ну, скажем, прямых таких команд у проца нет, а стек лежит где-то в отдельной программно недоступной памяти, счетчик команд тоже недоступен категорически)) Что перестанет работать в языке ??? Да ВСЕ, связанное с, не побоюсь этого слова - полиморфизмом. Не только виртуальные ф-ии! Процедурные типы - на помойку, абстрактные разъемы - туда же, система сообщений, и т.д., и т.п.. И не только в КП. Сигналы, которыми Илья поименовал дельфячий procedure of object - туда же. Т.е., одна "мелкая загогулина" рушит по половине функциональности во всех ЯВУ. И наоборот, обеспечивает любой вид полиморфизма, опять же - во всех ЯВУ. Так кто тут фундаментальный, на самом деле-то ![]() Думаю, что опять не поверят, и будут продолжать бояться - "а вдруг при смене компьютера...." ![]() ___________________________________________________________________ Не знаю... может следует объяснять полиморфизм ДО всяких ООП. Процедурный тип - вот вам самый элементарный полиморфизм (имеющий максимально прямое отражение в коды) И громко (типа: вбейте себе в мозг!!!) заявить, что все остальные виды его - это вариации вокруг этого типа... Не более, но и не менее... Не знаю, не педагог... |
Автор: | Илья Ермаков [ Вторник, 01 Декабрь, 2009 14:33 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Я так и объясняю, как разные вариации на одну тему. Только процедурный тип - это не полиморфизм, а виртуализация. Полиморфизм - это протаскивание расширенных типов через указатель или параметр базового. (Принцип Барбары Лисков, или, как я люблю говорить студентам "принцип рыбы-селёдки"). Кстати, не знаю, Вы в курсе или нет - но в базовом Обероне Вирта не было связанных процедур. А использовались поля записей процедурного типа. |
Автор: | Valery Solovey [ Вторник, 01 Декабрь, 2009 15:03 ] |
Заголовок сообщения: | Re: Как правильно создавать объекты? |
Galkov писал(а): Народ почему-то считает фундаментальным некое абстрактное определение (причем оно может быть разным на разных языках). Вообще-то определение вполне себе конкретное. И как на русском, так и на английском звучит одинаково (с незначительной долей погрешности).Galkov писал(а): Так кто тут фундаментальный, на самом деле-то А что Вы подразумеваете под фундаментальностью?Кстати, если холодильник правильно установить, то им можно охладить комнату. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |