С учётом замечаний Ивана Денисова и Олега Чередниченко (за что им большое спасибо) в итоге краткая сводка выглядит следующим образом:
Модула-2
Запись: Не должна быть нулевой (не содержащей полей), поскольку не расширяема. Оператор WITH используется для короткого доступа к полям записи; Процедура: Параметр-переменная (с идентификатором VAR) не может быть выражением или константой. В качестве результата процедуры-функции не могут выступать: запись, массив, поддиапазон, перечисления, множество. Иначе надо использовать процедуру с параметром-переменной (с идентификатором VAR). Поскольку указатель имеет целочисленный тип, он может быть аргументом процедуры и результатом процедуры-функции.
Оберон, Оберон-2
Запись: Может быть нулевой (не содержащей полей), поскольку расширяема и может экспортироваться. Базовой записи можно присвоить значение расширенной записи, но не наоборот. Указателю базовой записи можно присвоить значение указателя расширенной записи и наоборот.
Процедура: Если объявление процедуры содержит параметр-приёмник, процедура рассматривается как связанная с типом. Связь выражается типом приёмника в заголовке объявления процедуры. Приёмник может быть или записью в виде параметра-переменной (с идентификатором VAR), или указателем в виде параметра-значения. Если процедура связана с базовой записью, то она неявно связана с любым расширением базовой записи. Однако другая процедура с тем же самым именем, что и исходная, которая явно связана с расширением базовой записи, перекрывает исходную процедуру и рассматривается как её переопределение. Формальные параметры обеих процедур должны совпадать. Если к вызову переопределённой процедуры добавить ^, то вызывается исходная процедура. Вызвать исходную процедуру можно только из переопределённой. Проверка типа осуществляется только для конкретных типов записи или указателя и их прямых расширений. Проверка типа по типу записей осуществляется только в процедуре при передаче записей с идентификатором VAR (или IN для Компонентного Паскаля). Проверка типа по указателю может осуществляться как в теле программы, так и в отдельной процедуре. Локальный охранник (оператор WITH) осуществляет проверку соответствия записи или указателя их статическому типу, зафиксированному при объявлении этих переменных в разделе VAR программы, модуля или процедуры. Проверка типа (оператор IS) осуществляет проверку соответствия записи или указателя их текущему типу, при этом образуя их динамический тип, заменяющий на момент выполнения программы их статический тип, зафиксированный при объявлении этих переменных в разделе VAR программы, модуля или процедуры. Поэтому сначала необходимо с помощью оператора IS проверить текущий тип записи или указателя, а затем с помощью оператора WITH обеспечить доступ к тем полям записи, которые соответствуют её текущему типу. Если проверка осуществляется в процедуре, то передача параметра в виде записи или указателя неявно подразумевает оператор IS, поэтому использовать его в процедуре необязательно.
Компонентный Паскаль
Запись: В качестве базового типа может быть использован указатель. Атрибут ABSTRACT соответствует нулевой или ненулевой записи в Обероне. Нельзя создать экземпляр такой записи, но можно её расширить и экспортировать. Атрибут LIMITED соответствует ненулевой записи в Обероне, которая может расширяться, но не может экспортироваться. Атрибут EXTENSIBLE соответствует ненулевой записи в Обероне, которая может расширяться и экспортироваться. Запись без атрибутов соответствует ненулевой записи в Обероне, которая может экспортироваться, но не может расширяться.
Процедура: Идентификатор IN говорит о том, что эта переменная служит только для ввода данных и не может быть изменена в процедуре. Идентификатор IN допускается только для записей и массивов. Константы нельзя помечать идентификатором IN. Идентификатор OUT говорит о том, что эта переменная служит только для вывода результата и её значение в начале процедуры не определено. Все переменные с этим идентификатором, содержащие указатели и процедурные типы, инициализируют их значением NIL. Идентификатор VAR говорит о том, что эта переменная может модифицироваться в процедуре и хранить полученный результат.
Для процедур, связанных с типами: Процедуры, возвращающие указатель, могут быть переопределены таким образом, чтобы возвращать указатель на расширенный тип и быть связанной с расширенным типом. Атрибут NEW используется для вновь создаваемых для данной записи процедур (имя процедуры должно быть уникальным для базовой записи и её расширений). Атрибут ABSTRACT используется для записей с атрибутом ABSTRACT и в расширенной записи перед использованием процедура должна быть переопределена, поскольку в базовой записи процедура пустая. Атрибут EXTENSIBLE используется для указания, что эта процедура может быть переопределена и используется для записей с атрибутами ABSTRACT или EXTENSIBLE. Атрибут EMPTY используется для указания, что процедура является пустой. В отличие от процедуры с идентификатором ABSTRACT, при расширении записи с такой процедурой её не надо переопределять (или переопределять в случае необходимости). Она используется для записей с атрибутами ABSTRACT или EXTENSIBLE. Если она не переопределялась, то её вызов не даёт никакого эффекта. Процедуры с атрибутом EMPTY не могут быть процедурами-функциями и не могут иметь OUT параметров. Отсутствие атрибутов говорит о том, что процедура не может переопределяться и используется в записи без атрибутов.
Экспорт переменных и записей
Экспортируемая переменная становится глобальной в модулях, которые её экспортируют, и в модуле, который её экспортирует. Если экспортируемая (большая) запись в качестве одного из полей содержит другую (малую) запись, то для доступа к переменным этого поля в импортирующем модуле достаточно в экспортирующем модуле экспортировать только переменные малой записи, при этом в импортирующем модуле нельзя создавать переменные типа малой записи. Если в импортирующем модуле необходимо создавать переменные типа малой записи, необходимо экспортировать и малую запись. Экспорт только для чтения используется только для переменных.
Буду рад, если это облегчит новичкам понимание особенностей языков уважаемого мной Никлауса Вирта.
|