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/ |