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: Как правильно создавать объекты?

И все это называется полиморфизм, без понимания его устройства :lol:
Бедные дети... :D

Автор:  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 писал(а):
Вот сказали Вы "полиморфизм" и сразу стало всё понятно?

Дык я и говорю, что нет :D
Типа, если русскому человеку скажут, что надо снизить скорость, то ему это будет непонятно.
Пока не скажут ПОЧЕМУ. Ну, скажем, впереди лежачий полицейский... А кирпич - потому-что дальше мост разобран :lol:

Вспоминаю, как я тупо лбом бился об эти вопросы...
Пока не подсел на конкретику. Ну, скажем, есть подпрограмма сортировки массива из каких-нибудь объектов. Которой очень надо для работы подпрограмка сравнения двух объектов. Если объекты конкретные - все ясно, вот она подпрограммка, вставляем ее, и нет проблем.
И знание/понимание появляется после того, когда осознаешь тот факт, что основную программу можно написать не зная, где лежит эта подпрограмма сравнения, и какая она вообще. Называется косвенный функциональный вызов: кто-то поставил в какую-то ячейку нужный адрес подпрограмки, все начало работать. Подставили адрес другого алгоритма сравнения - работает уже по-другому. Ничего не подставил (это и есть абстракт) - нельзя и запускать.
После такого у меня в мозгу и произошло "просветление", установилась точная ассоциативная связь между буржуинским словом полиморфизм, и тем, что реально происходит.
И дурацкие вопросы, почему нельзя создавать абстракты - перешли из разряда священных мантр, в разряд очевидных логических выводов.

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

И жалко детей, котором дают это так же, как нам давали политэкономию социализма - на уровне священных мантр.
Так - ЗЯ, а так - НИЗЯ, потому-что противоречит некой концепции, до которой ты еще не дорос :D

Автор:  Илья Ермаков [ Понедельник, 30 Ноябрь, 2009 14:41 ]
Заголовок сообщения:  Re: Как правильно создавать объекты?

Вот только сегодня объяснял связанные процедуры и виртуальные вызовы.

Параллельно и прикладным образом (показывая конкретный пример), и "технарски" - рисуя, как именно вводится косвенность вызова. (Когда указатели и структура памяти программы уже разобрана - куча, теги типов.., то всё легко).
Т.е. "переменность" вызываемой операции.

Автор:  Иван Кузьмицкий [ Понедельник, 30 Ноябрь, 2009 20:55 ]
Заголовок сообщения:  Re: Как правильно создавать объекты?

Когда я проектирую абстрактный класс и его использование, я вовсе не задумываюсь о таблицах виртуальных методов, ячейках, атомах и прочих молекулах. Это уровень технической реализации, а я отталкиваюсь от словаря проблемной области. И тут абстрактный класс необходим именно как абстрактный, не имеющий "физического" воплощения. Воплощение происходит в конкретных наследниках.

Поэтому для меня в данном контексте невозможность создания экземпляра абстрактной сущности совершенно естественно выглядит. Потому что это понятие выражается не в терминах адресов и ячеек, а в терминах когнитивных процессов.

Автор:  Илья Ермаков [ Понедельник, 30 Ноябрь, 2009 21:02 ]
Заголовок сообщения:  Re: Как правильно создавать объекты?

Не забывайте, что Вы всё это уже знаете. И об этом не думаете.
Вы же не думаете о том, как устроен холодильник или видеомагнитофон, когда ими пользуетесь.
Но имеется таки принципиальная разница - не думаете Вы, зная, или не задумывается современных школьник, не зная.
Во многих случаях эта разница даёт о себе знать.

Автор:  Galkov [ Понедельник, 30 Ноябрь, 2009 21:22 ]
Заголовок сообщения:  Re: Как правильно создавать объекты?

Ну если уж совсем не думать про устройство холодильника, то можно предположить, что им можно охладить комнату, если открыть дверцу.

При этом, у тех кто тоже не думает (но потому-что давно знает) встают дыбом волосы от таких предположений.
Хоть и не каждый день встают, но от такого шока ведь не сразу отходишь :D

P.S. Вот, блин, написал, и стал бояться - вдруг придется разъяснять почему "комнату не охладишь"

Автор:  Илья Ермаков [ Понедельник, 30 Ноябрь, 2009 21:25 ]
Заголовок сообщения:  Re: Как правильно создавать объекты?

С точки зрения Мин. обр. это несущественно для выращивания "грамотного потребителя" (С) Фурсенко.

Автор:  Galkov [ Понедельник, 30 Ноябрь, 2009 21:43 ]
Заголовок сообщения:  Re: Как правильно создавать объекты?

Илья, Вы хотите, чтобы я совсем застрелился с тоски ??? Не дождетесь :D

Автор:  Илья Ермаков [ Понедельник, 30 Ноябрь, 2009 21:49 ]
Заголовок сообщения:  Re: Как правильно создавать объекты?

Не надо, патроны стоит поберечь. :|

Автор:  Иван Кузьмицкий [ Понедельник, 30 Ноябрь, 2009 21:56 ]
Заголовок сообщения:  Re: Как правильно создавать объекты?

А я и не говорю, что про тонкости технической платформы не надо знать.

Я про то, что рассуждения, например, об абстрактном классе, необходимо вести с двух позиций - не токмо с "атомно-молекулярной", но и с системной.

Автор:  Илья Ермаков [ Понедельник, 30 Ноябрь, 2009 22:22 ]
Заголовок сообщения:  Re: Как правильно создавать объекты?

Ну так именно так. :)

Автор:  Galkov [ Вторник, 01 Декабрь, 2009 14:18 ]
Заголовок сообщения:  Re: Как правильно создавать объекты?

Даже удивительно...

Народ почему-то считает фундаментальным некое абстрактное определение (причем оно может быть разным на разных языках).
А про этот злополучный "косвенный функциональный вызов" считается знать опасным по той причине, :idea: что его может не оказаться при смене компьютера :shock:
Не намного умнее, между прочим, чем "охладить комнату холодильником". Хоть обижайтесь, хоть нет - уровень понимания примерно один.

Ну предположим такую дикость: выпустили процессор БЕЗ возможности "косвенного функционального вызова"
((ну, скажем, прямых таких команд у проца нет, а стек лежит где-то в отдельной программно недоступной памяти, счетчик команд тоже недоступен категорически))
Что перестанет работать в языке ???
Да ВСЕ, связанное с, не побоюсь этого слова - полиморфизмом. Не только виртуальные ф-ии! Процедурные типы - на помойку, абстрактные разъемы - туда же, система сообщений, и т.д., и т.п..
И не только в КП. Сигналы, которыми Илья поименовал дельфячий procedure of object - туда же.
Т.е., одна "мелкая загогулина" рушит по половине функциональности во всех ЯВУ. И наоборот, обеспечивает любой вид полиморфизма, опять же - во всех ЯВУ.

Так кто тут фундаментальный, на самом деле-то :?:
Думаю, что опять не поверят, и будут продолжать бояться - "а вдруг при смене компьютера...." :D

___________________________________________________________________
Не знаю... может следует объяснять полиморфизм ДО всяких ООП.
Процедурный тип - вот вам самый элементарный полиморфизм (имеющий максимально прямое отражение в коды)
И громко (типа: вбейте себе в мозг!!!) заявить, что все остальные виды его - это вариации вокруг этого типа... Не более, но и не менее...
Не знаю, не педагог...

Автор:  Илья Ермаков [ Вторник, 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/