2. на счёт второго пункта признаю неправоту. множества там вовсе не при чём.
4. почему я сравниваю модули и ООП? сейчас объясню.
для начала хочу сказать, что буду оперировать такими понятиями, как абстракция и объект (не объект класса).
за объект я буду принимать некую конкретную сущность, за абстрактную - эммм... абстрактную сущность.
ну допустим класс это абстрактная вещь, а объект класса это уже вполне себе конкретная вещь, которую можно пощупать.
или, например, переменная это конкретная вещь, а её тип - абстракция.
теперь давайте возьмём один экземпляр класса. не сам класс, а экземпляр, т.е объект, полученный от класса. и рассмотрим его поближе.
из чего он состоит? он состоит из полей и методов. часть полей и методов (а зачастую - только часть методов) располагаются в зоне, видимой для внешней части программы, а другая часть - в невидимой. другими словами, объект класса имеет область привата и публичную область. и только. у класса есть ещё защищённая область, но она нужна при наследовании, а конкретный объект класса с наследованием уже не работает. классы наследуют друг друга, но не объекты класса.
полиморфизм также свойственен объектам класса, т.е перегруженность функций.
в итоге получаем, что для объекта класса свойственны инкапсуляция и полиморфизм, но не наследование.
теперь рассмотрим модуль. что мы имеем? модуль не абстракция. это вполне себе объект в виде файла.
когда мы пишем uses unit_1, то, грубо говоря, даём ссылку на файл с модулем - ссылку на конкретный объект.
у модуля есть зона, видимая для внешнего мира программы, и закрытая зона, как по аналогии с приватной и публичной зоной объекта класса. т.е выполняется условие инкапсуляции.
перегрузка функций также присутствует, что говорит о полиморфизме.
и есть даже некое подобие конструктора, т.е начальные действия модуля сразу после его вызова.
как видно, объект класса (не сами классы) и модули очень похожи. да не то, что похожи, они практически идентичны.
пожалуй по этой причине я сравниваю ООП с модулями.
но я продолжу свои рассуждения.
можно сказать, что классы это тип данных. об это говорит то, что классы объявляются в зоне type, и то, что класс указывается, как тип переменной при её объявлении.
класс это абстракция. тип данных это тоже абстракция. при объявлении переменной типа класса мы получаем объект - переменная-объект (объект класса).
как выяснили раньше, объект класса мало чем отличается от модуля. т.е, если сказать грубо, то класс это абстракия модуля, т.е класс это тип модуля.
новый тип в программировании - тип модуля, который почему то назвалии классами.
это буквально то же самое, что если бы мы могли сделать такое:
- Код: Выделить всё
uses unit_1;
type
MyUnit = unit_1;
var
ObjMyUnit: MyUnit;
ArrObjMyUnit: array[1..10] of MyUnit;