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

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску

Понятие о типах[править]

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

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

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

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

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

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

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

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