Записи

Запись представляет собой набор элементов разных типов, каждый из которых имеет свое имя и называется полем записи. Тип записи конструируется следующим образом:

record
   список полей
   список методов
end

Приведем пример записи, содержащей только поля:

type
  SexType = (male, female);
  Person = record
    Name: string;
    Age, Weight: integer;
    Sex: SexType;
  end;

При описании переменной или константы типа запись можно использовать инициализатор записи (как и в Object Pascal):

const p: Person = (Name: 'Петрова'; Age: 18; Weight: 55; Sex: female);

var p: Person := (Name: 'Иванов'; Age: 20; Weight: 80; Sex: male);

Присваивание записей копирует содержимое полей одной переменной-записи в другую:

d2 := d1;

Для записей принята именная эквивалентность типов: можно присваивать друг другу и передавать в качестве параметров подпрограмм записи, совпадающие только по имени.

В отличие от Object Pascal, в PascalABC.NET отсутствуют записи с вариантами.

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

Список отличий между записями и классами приводятся ниже:

  1. Запись представляет собой размерный тип (переменные типа запись располагаются на стеке).
  2. Записи нельзя наследовать; от записей также нельзя наследовать (отметим, что записи, тем не менее, могут реализовывать интерфейсы). В .NET тип записи неявно предполагается наследником типа System.ValueType и реализуется struct-типом.

Конструкторы для записей имеют тот же синтаксис, что и для классов. Однако, в отличие от классов, вызов конструктора записи не создает новый объект в динамической памяти, а только инициализирует поля записи.

По умолчанию процедура write для переменной типа запись выводит ее тип. Чтобы изменить это поведение, в записи следует переопределить метод ToString класса Object.

Например:

type
  SexType = (male, female);
  Person = record
  private

    Name: string;
    Age, Weight: integer;
    Sex: SexType;
  public
    constructor Create(Name: string; Age, Weight: integer; Sex: SexType);
    begin
      Self.Name := Name;
      Self.Age := Age;
      Self.Weight := Weight;
      Self.Sex := Sex;
    end;
    function ToString: string; override;
    begin
      Result := string.Format('Имя: {0} Возраст: {1} Вес: {2} Пол: {3}',
                              Name, Age, Weight, Sex);
    end
  end;
  ...
var p: Person := new Person('Иванов',20,70,Sex);
writeln(p);