OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 20:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: Понедельник, 21 Июнь, 2021 20:41 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
Примерно так:

Цитата:
TYPE o = OBJECT ... END;

VAR o1, o2 : o;

BEGIN
o1^ := o2^
END.


По смыслу всё содержимое объекта (включая все частные поля) копируется из o2 в о1. Хотя я делал это в методе o, может быть, вне методов o такое не скомпилируется - просто не пробовал.

Это фича или баг? Я не поручусь, что прямо все поля так присваиваются, но некоторые точно присваиваются :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 21 Июнь, 2021 22:00 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
А почему это может быть багом?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 21 Июнь, 2021 22:36 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
Вот более содержательный пример:

Код:
MODULE DefO;

VAR schjotchik : SIZE;

TYPE o* = OBJECT
   VAR
   f* : SIZE;
   skrytoePole- : SIZE;
   
   PROCEDURE &new_o*();
   BEGIN
      skrytoePole := schjotchik;
      INC(schjotchik)
   END new_o;
   
END o;

END DefO.


Код:
MODULE Primer;

IMPORT DefO;

VAR o1, o2 : DefO.o;
   
PROCEDURE Do*();
BEGIN
NEW(o1);
NEW(o2);
ASSERT(o1.skrytoePole # o2.skrytoePole);
o2.f := 7;
o1^ := o2^;
TRACE(o1.skrytoePole = o2.skrytoePole);
END Do;

END Primer.

Primer.Do  ~


Печатает
Код:
{P cpuid= 0, pid= 8848 Primer.Do@159:(o1^.skrytoePole = o2^.skrytoePole)= TRUE; }


Протекла инкапсуляция, единственное, поле надо было назвать не „скрытым“, а „защищённым“.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Июнь, 2021 02:02 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
budden писал(а):
Протекла инкапсуляция
Ну, как бы с одной стороны вроде бы протекла, а с другой стороны вы просто склонировали объект и теперь у вас его две копии. Это надо просто иметь в виду как особенность системы - любой системы, где есть SYSTEM.MOVE, в общем-то. Так что уникальные идентификаторы должны быть основаны на указателях (каждый из которых как раз и является уникальным значением), а не на простых полях, чтобы в конечном итоге только сборщик мусора ими управлял.

В КП для таких случаев я публиковал только абстрактный класс и фабрику, а уникальное содержимое делал в расширенном типе, который не опубликован. Тогда такой трюк становится недоступен.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Июнь, 2021 05:19 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 293
Откуда: Russia
OBJECT - синтаксический сахар над POINTER TO RECORD.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Июнь, 2021 11:41 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
Спасибо, всё понял! А можно ли у указателя сделать "тело"?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Июнь, 2021 13:18 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
budden писал(а):
Спасибо, всё понял! А можно ли у указателя сделать "тело"?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Июнь, 2021 15:18 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 293
Откуда: Russia
budden писал(а):
Спасибо, всё понял! А можно ли у указателя сделать "тело"?
В первоначальномой версии языка, в которой не было OBJECT, так и было. Сейчас для этого есть объект.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Июнь, 2021 19:50 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
Сергей меня понял. Имелся в виду безымянный составной оператор, который выполняется автоматически.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB