Компонентный Паскаль/Введение в типы

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

править

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

  • реактивные
  • механические
  • электрические

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

  • по типу источника энергии
  • по мощности
  • по весу

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

  • бензиновые
  • дизельные
  • керосиновые и т.д.

Теперь если где-то будет написано: "Легендарный автомобиль "Жигули" седьмой модели, производимый в Советском Союзе обладал механическим бензиновым движетелем..." теперь можно точно сказать, что двигатель этот был не керосиновый и уж точно не реактивный, хотя при этом ещё можно и не знать, что такое "бензин", или "электрический движетель". Точно также, и кладовщик, работавший на том же автомобильном заводе, не разбирался, чем отличается шпонка №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.

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