Записи Запись представляет собой набор элементов разных типов, каждый из которых имеет свое имя и называется полем записи. Тип записи конструируется следующим образом: 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 отсутствуют записи с вариантами. Помимо полей, внутри записей могут содержаться также методы и свойства. Таким образом, записи очень близки к классам. Список отличий между записями и классами приводятся ниже: Запись представляет собой размерный тип (переменные типа запись располагаются на стеке). Все члены записей – публичные, модификаторы доступа внутри записей запрещены. Записи нельзя наследовать; от записей также нельзя наследовать (отметим, что записи, тем не менее, могут реализовывать интерфейсы). В .NET тип записи неявно предполагается наследником типа System.ValueType и реализуется struct-типом. Конструкторы для записей имеют тот же синтаксис, что и для классов. Однако, в отличие от классов, вызов конструктора записи не создает новый объект в динамической памяти, а только инициализирует поля записи. По умолчанию процедура write для переменной типа запись выводит ее тип. Чтобы изменить это поведение, в записи следует переопределить метод ToString класса Object. Например: type SexType = (male, female); Person = record Name: string; Age, Weight: integer; Sex: SexType; 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);
|