Компонентный Паскаль/Введение в типы
Понятие о типах
[править]Тип -- это классификация чего либо. Например, движетели:
- реактивные
- механические
- электрические
Механические движетели разделяются:
- по типу источника энергии
- по мощности
- по весу
По типу источника энергии движетели разделяются:
- бензиновые
- дизельные
- керосиновые и т.д.
Теперь если где-то будет написано: "Легендарный автомобиль "Жигули" седьмой модели, производимый в Советском Союзе обладал механическим бензиновым движетелем..." теперь можно точно сказать, что двигатель этот был не керосиновый и уж точно не реактивный, хотя при этом ещё можно и не знать, что такое "бензин", или "электрический движетель". Точно также, и кладовщик, работавший на том же автомобильном заводе, не разбирался, чем отличается шпонка №14 от прокладки паранитовой № 2. Но он точно, знал, что одному рабочему надо выдать шпонку № 14, а другому прокладку паранитовую № 2. А если учесть, что в автомобиле "Жигули" более 8 тыс. деталей, вообще странно как можно собирать подобные машины, и как они могут ездить? (а ездят "Жигули" очень и очень не плохо, хотя многим машинам уже за 30-35 лет).
Вот такое разделение по видам и группам называется типизацией, а любой попавший объект в эту систему типизации -- имеет свой тип. Понятно, что для сборки машины не нужно, всё что есть вводить в систему типов. Ну например, к чему там уран? Или Марс? Хотя, для организации производства вполне может пригодиться тип "источник_освещения" (ведь конвейер работал круглосуточно). Именно поэтому, могут жить по настоящему большие и сложные системы. Точно также, в КП введено понятие типа; с некоторыми встроенными типами переменных было ознакомление в первых главах, но язык был бы слабым, если бы не позволял программисту расширять систему типов своими типами.
Определение типа
[править]По большому счёту, никаких базовых типов программист уже добавить не может. Он может на основе базовых типов создавать только пользовательские (расширенные) типы. И здесь вся ответственность за создание нового типа ложится только на программиста. На основе последнего примера посмотрим как можно использовать типы в программе:
Hello8.odc
MODULE TestHello08;
(* Этот пример показывает как объявлять
типы и их использовать *)
IMPORT Log, Math;
TYPE
TPoint = RECORD
coord_x, coord_y: INTEGER;
enabled: BOOLEAN;
color: ARRAY 5 OF INTEGER
END;
VAR
r: TPoint;
PROCEDURE Start*;
VAR
i: INTEGER;
BEGIN
r.coord_x := 5;
r.coord_y := 4;
Log.Int(r.coord_x); Log.String(', ');
Log.Int(r.coord_y); Log.Ln;
r.color[0] := 4;
r.color[4] := - 10;
FOR i := 0 TO 4 DO
Log.Int(r.color[i]); Log.String(', ')
END;
Log.Ln
END Start;
BEGIN
END TestHello08.
В верхней части модуля теперь появилась новая секция TYPE. В ней объявляется пользовательский тип "TPoint". Буква "Т" впереди есть сокращение от TYPE и намекает, что это тип. Даже с учётом того, что имя типа начинается на большую букву, спутать с именем процедуры будет не просто, так как имя типа начинается "T", что сразу обращает на себя внимание. Также надо запомнить, что при объявлении типа ставится знак "равно", а не "двоеточие".
Чуть ниже в секции VAR объявляется переменная "r" типа "TPoint". И теперь при задании переменных с записевым типом не нужно каждый раз описывать поля этой записи. В обиходе программистов такая операция называется "создать экземпляр". Работа с экземпляром типа TPoint ничем не отличается от работы с записевым типом.
На текущий момент теперь в модулях КП можно оперировать несколькими типами секций: IMPORT, CONST, TYPE и VAR. Любая из этих секций может отсутствовать в модуле, в процедурах можно использовать любую секцию кроме IMPORT.
Это лишь вершина айсберга от того, что касается типов. Типы можно наследовать, расширять, модифицировать и мн. др. Но пока мы не будем касаться этой темы.