Содержание

1.12 Введение в типы

1. Понятие о типах

Тип — это классификация чего-либо. Например, движетели:

Механические движетели разделяются:

По типу источника энергии движетели разделяются:

Теперь если где-то будет написано: «Легендарный автомобиль «Жигули» седьмой модели, производимый в Советском Союзе обладал механическим бензиновым движетелем…» теперь можно точно сказать, что двигатель этот был не керосиновый и уж точно не реактивный, хотя при этом ещё можно и не знать, что такое «бензин», или «электрический движетель». Точно так же, и кладовщик, работавший на том же автомобильном заводе, не разбирался, чем отличается шпонка № 14 от прокладки паранитовой № 2. Но он точно знал, что одному рабочему надо выдать шпонку № 14, а другому прокладку паранитовую № 2. А если учесть, что в автомобиле «Жигули» более 8 тыс. деталей, вообще странно как можно собирать подобные машины, и как они могут ездить? (а ездят «Жигули» очень и очень не плохо, хотя многим машинам уже за 30-35 лет).

Вот такое разделение по видам и группам называется типизацией, а любой попавший объект в эту систему типизации — имеет свой тип. Понятно, что для сборки машины не нужно, всё что есть вводить в систему типов. Ну например, к чему там уран? Или Марс? Хотя, для организации производства вполне может пригодиться тип источник_освещения (ведь конвейер работал круглосуточно). Именно поэтому, могут жить по настоящему большие и сложные системы. Точно также, в КП введено понятие типа; с некоторыми встроенными типами переменных было ознакомление в первых главах, но язык был бы слабым, если бы не позволял программисту расширять систему типов своими типами.

2. Определение типа

По большому счёту, никаких базовых типов программист уже добавить не может. Он может на основе базовых типов создавать только пользовательские (расширенные) типы. И здесь вся ответственность за создание нового типа ложится только на программиста. На основе последнего примера посмотрим как можно использовать типы в программе:

Привет8.odc
MODULE КнигаПривет8;
	(* Этот пример показывает как объявлять
	типы и их использовать *)
 
	IMPORT мЛог := Log,
		Math;
 
	TYPE
		тТочка = RECORD
			цКоорд_Х, цКоорд_У: INTEGER;
			цВкл: BOOLEAN;
			мцЦвет: ARRAY 3 OF INTEGER
		END;
 
	VAR
		точка: тТочка;
 
	PROCEDURE Старт*;
 
		VAR
			лцИтер: INTEGER;
 
	BEGIN
		точка.цКоорд_Х := 5;
		точка.цКоорд_У := 4;
		мЛог.Int(точка.цКоорд_Х); мЛог.String(', ');
		мЛог.Int(точка.цКоорд_У); мЛог.Ln;
		точка.мцЦвет[0] := 4;
		точка.мцЦвет[2] :=  - 10;
		FOR лцИтер := 0 TO 2 DO
			мЛог.Int(точка.мцЦвет[лцИтер]); мЛог.String(', ')
		END;
		мЛог.Ln
	END Старт;
 
BEGIN
END КнигаПривет8.

В верхней части модуля теперь появилась новая секция TYPE. В ней объявляется пользовательский тип тТочка. Буква т впереди есть сокращение от TYPE и намекает, что это тип. Даже с учётом того, что имя типа начинается на большую букву, спутать с именем процедуры будет не просто, так как имя типа начинается т, что сразу обращает на себя внимание. Также надо запомнить, что при объявлении типа ставится знак «равно», а не «двоеточие».

Чуть ниже в секции VAR объявляется переменная точка типа тТочка. И теперь при задании переменных с записевым типом не нужно каждый раз описывать поля этой записи. В обиходе программистов такая операция называется «создать экземпляр». Работа с экземпляром типа тТочка ничем не отличается от работы с записевым типом.

На текущий момент в модулях КП можно оперировать несколькими типами секций: IMPORT, CONST, TYPE и VAR. Любая из этих секций может отсутствовать в модуле, в процедурах можно использовать любую секцию, кроме IMPORT.

3. Заключение

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