| Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
bb:redbook:112 [2017/08/30 16:31] prospero78 [2. Определение типа] |
— (текущий) |
| ===== 1.12 Введение в типы ===== | |
| |
| ==== 1. Понятие о типах ==== | |
| //Тип// — это //классификация// чего-либо. Например, движетели: | |
| |
| * реактивные | |
| * механические | |
| * электрические | |
| |
| Механические движетели разделяются: | |
| |
| * по типу источника энергии | |
| * по мощности | |
| * по весу | |
| |
| По типу источника энергии движетели разделяются: | |
| |
| * бензиновые | |
| * дизельные | |
| * керосиновые и т. д. | |
| |
| Теперь если где-то будет написано: "Легендарный автомобиль "Жигули" седьмой модели, производимый в Советском Союзе обладал механическим бензиновым движетелем..." теперь можно точно сказать, что двигатель этот был //не керосиновый// и уж точно //не реактивный//, хотя при этом ещё можно и не знать, что такое "бензин", или "электрический движетель". Точно так же, и кладовщик, работавший на том же автомобильном заводе, //не разбирался//, чем //отличается// шпонка № 14 от прокладки паранитовой № 2. Но он //точно знал//, что одному рабочему надо выдать шпонку № 14, а другому прокладку паранитовую № 2. А если учесть, что в автомобиле "Жигули" более 8 тыс. деталей, вообще странно //как можно// собирать подобные машины, и как они могут ездить? (а ездят "Жигули" очень и очень не плохо, хотя многим машинам уже за 30-35 лет). | |
| |
| Вот такое разделение по видам и группам называется //типизацией//, а любой попавший объект в эту систему типизации — имеет свой тип. Понятно, что для сборки машины не нужно, всё что есть вводить в систему типов. Ну например, к чему там //уран//? Или //Марс//? Хотя, для организации производства вполне может пригодиться тип ''источник_освещения'' (ведь конвейер работал круглосуточно). Именно поэтому, могут жить //по настоящему большие// и сложные системы. Точно также, в **КП** введено понятие //типа//; с некоторыми встроенными типами переменных было ознакомление в первых главах, но язык был бы //слабым//, если бы не позволял программисту //расширять// систему типов своими типами. | |
| ==== 2. Определение типа ==== | |
| По большому счёту, никаких базовых типов программист уже добавить не может. Он может на основе базовых типов создавать только пользовательские (расширенные) типы. И здесь вся ответственность за создание нового типа ложится только на программиста. На основе последнего примера посмотрим как можно использовать типы в программе: | |
| |
| Привет8.odc | |
| | |
| <code oberon2> | |
| 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. | |
| </code> | |
| | |
| |
| В верхней части модуля теперь появилась новая секция ''TYPE''. В ней объявляется пользовательский тип ''тТочка''. Буква ''т'' впереди есть сокращение от ''TYPE'' и намекает, что это //тип//. Даже с учётом того, что имя типа начинается на большую букву, спутать с именем процедуры будет не просто, так как имя типа начинается ''т'', что сразу обращает на себя внимание. Также //надо запомнить//, что при объявлении типа ставится знак "равно", а не "двоеточие". | |
| |
| Чуть ниже в секции ''VAR'' объявляется переменная ''точка'' типа ''тТочка''. И теперь при задании переменных с записевым типом не нужно каждый раз описывать поля этой записи. В обиходе программистов такая операция называется "создать экземпляр". Работа с экземпляром типа ''тТочка'' ничем не отличается от работы с записевым типом. | |
| |
| На текущий момент в модулях **КП** можно оперировать несколькими типами секций: ''IMPORT'', ''CONST'', ''TYPE'' и ''VAR''. Любая из этих секций может отсутствовать в модуле, в процедурах можно использовать любую секцию, кроме ''IMPORT''. | |
| ==== 3. Заключение ==== | |
| Это лишь вершина айсберга от того, что касается //типов//. Типы можно наследовать, расширять, модифицировать и мн. др. Как это делать будет рассмотрено отдельно. | |