Инкапсуляция (Encapsulation) – скрытие данных для обеспечения максимально возможной независимости объектов. Доступ к данным только с использованием методов работы с ними внутри класса. Инкапсуляция позволяет:
- Скрыть от внешнего мира внутреннюю структуру объекта, допуская взаимодействие с ним только через разрешенные каналы связи. Это исключает возможность неправильных действий над данными со стороны внешнего мира.
- Изменять в процессе разработки каждый класс без влияния на остальную часть программы.
Наследование
Наследование (Inheritance)- создание новых классов-потомков, которые обладают всеми свойствами классов-предков. Целесообразно при создании нового класса использовать свойства имеющегося класса. Исходный класс называется предок, производный – потомок. Класс-потомок наследует все описания и методы класса-предка. Для него нужно описать только дополнительные свойства.
Классы образуют иерархическое дерево.
Принцип наследования обеспечивает поэтапное создание сложных классов. Класс-потомок получает все поля своих предков, но не может их удалять или переопределять. Чем ниже находится класс в дереве иерархии, тем большими данными располагают объекты этого класса.
Объекты Паскаля. Часть 1. Урок 49
Полиморфизм
Полиморфизм – использование для разных объектов неодинаковых методов под одинаковыми именами.Функционально одинаковые операции с объектами предками и потомками лучше именовать одинаково. При этом можно преобразовывать процедуры объекта предка. Это называется переопределением (или перекрытием). Одноименные методы разных объектов делаются уникальными введением слова virtual (виртуальный) после заголовка метода.
Перед работой с виртуальными методами используется метод constructor. Он заставляет при компиляции составлять таблицу с адресами виртуальных методов, по которой выбирается нужный метод. Адрес метода определяется на стадии обращения к нему. Это называется поздним связыванием. В качестве этого метода может использоваться любая процедура.
В ее заголовке вместо слова procedure употребляется слово constructor.
Метод рекомендуется делать виртуальным, когда предполагается его дальнейшее изменение. Для невиртуальных методов используется раннее связывание, когда адрес метода определяется при его компиляции. Если в классе-предке есть виртуальный метод, то все методы с аналогичным именем у классов-потомков должны быть виртуальными.
Создание класса
Новые классы объявляются в разделе типов type.
type
= class()
описание новых данных;
заголовки новых методов;
Класс должен быть объявлен до создания объектов класса. Каждый объект имеет уникальную копию полей класса, но все объекты класса используют одни и те же методы. Объекты создаются при исполнении программы в динамической памяти. Для создания объекта используется метод constructor, а для уничтожения – destructor.
Поля класса
Поля класса – данные, содержащиеся в классе. Описываются, как переменная любого типа. Поля могут быть любого типа, в том числе и классами. По соглашению имена полей начинают с префикса F (field – поле). Для скрытия от внешнего мира структуры класса поля обычно размещаются в группе частных описаний private.
free pascal ООП Классы в Паскале: Объект, метод, конструктор, поля
Доступ к ним осуществляется через свойства.
Рекомендуется обращаться к полям с помощью методов класса. Допускается (но не рекомендуется) и прямое обращение. Например,
При компиляции оно будет автоматически преобразовываться в вызов метода класса.
Свойства класса
Свойство – средство доступа к полям, которые прямо не доступны. Свойства (они published) дают доступ к полям, напрямую недоступным (они private). Формат свойства:
property [Индексы]: index Спецификаторы;
Имя имеет индексы, если свойство – массив. index присутствует, если свойство – массив. Спецификаторы – определяют действия со свойствами:
| Спецификатор | Назначение |
| read | Читать свойство |
| write | Писать свойство |
property Code:Integer read FCode write FCode;
property Note:String read FNote;
Методы класса/объекта
Метод – подпрограмма (процедура или функция), являющаяся членом класса. Объектные методы подобны обычным процедурам и функциям, только они имеют еще экстра-параметр self.
Формат вызова метода: .. Метод объявляется в классе, как обычная подпрограмма с директивой forward. В описании класса находится заголовок метода, а код метода в разделе реализации метода, где имеет составное имя, включающее тип класса. Способ вызова метод, объявленного в классе, задается модификатором метода, вводимым после заголовка метода через точку с запятой. Если модификатора нет, то метод считается статическим и вызывается, как обычная подпрограмма. Методы могут быть:
| Метод | Модификатор | Описание |
| Абстрактный | abstract | Родоначальник для потомков. |
| Наследуемый | Наследуется у класса-предка. | |
| Статический | Подключается компилятором. | |
| Виртуальный | virtual | Запускается при прогоне программы. |
| Повторный | reintroduce | Запускается повторно. |
| Перекрывающий | override | Имеет имя, как у метода класса-предка. Или модифицирован, или совсем другой. |
| Сообщение | message | Обработка сообщений. |
Классы имеют виртуальные методы, а объекты – нет. Это и есть отличие между ними. Для объектов достаточно переобъявить тот же метод в объекте потомка с ключевым словом virtual для перекрытия. Для классов ситуация несколько иная: виртуальные методы должны быть перекрыты с ключевым словом override. Если так не сделать, запустится тот же виртуальный метод, скрывающий предыдущий.
Ключевое слово Inherited не перескочит на унаследованный метод, если было использовано virtual.
Абстрактный метод
Абстрактными называются методы, которые определены в классе, но не содержат никаких действий, никогда не вызываются и обязательно должны быть переопределены в потомках класса. Абстрактные методы определены в классах, основное предназначение которых – быть родоначальником иерархии конкретных классов и дать возможность абстрагироваться от частностей. Абстрактными могут быть только виртуальные и динамические методы. В FPC такие методы объявляются с помощью одноименной директивы. Она указывается при описании метода:
procedure NeverCallMe; virtual; abstract;
Статический метод
Статический метод «подключается» при компиляции, т.е. его код размещается в статической памяти. Методы по умолчанию статические. При вызове такого метода его реализация определяется типом переменной объекта, для которого метод вызывается, а не именем метода. В примере две реализации метода Draw.
Виртуальные методы
Эти методы загружаются при прогоне программы. Поэтому в отличие от статических могут перекрываться у классов-потомков. При вызове такого метода его реализация определяется не типом переменной объекта, для которого метод вызывается, а типом вызываемого метода. В примере три реализации метода Draw.
Чтобы сделать метод таким, нужно в объявление метода добавить модификатор virtual или dynamic. При создании объекта конструктор заносит адреса методов в таблицу виртуальных методов TVM или в таблицу динамических методов TDM. По этим адресам при прогоне вызывается требуемый метод.
Перекрывающий метод
Перекрывающий метод в классе-потомке помечается модификатором override. Этот метод должен согласовываться м переопределяемым методом класса-предка по аргументам. Статические методы перекрываться не могут. Часто в перекрывающем методе используются коды методов классов-предков. При этом требуется ссылка на метод класса-предка.
Для этого предназначено слово inherited (унаследованный). Оно может применяться в двух вариантах:
- inherited . Наследуется указанный метод. Выбирается от ближайшего класса-предка.
- inherited. Наследуется метод с тем же именем, что у класса-потомка. Выбирается от ближайшего класса-предка.
Источник: pascal-cod.ru
#25 ООП Паскале. Введение: Класс, объект, конструктор, метод, поле
![]()
ООП (Объектно Ориентированное Программирование) — подход к разработке программ, в котором в любой задаче пытаются выделить набор «объектов» и с помощью кода описать их свойства и возможное «поведение» внутри программы.
Для работы в этом стиле высокоуровневые языки программирования обладают специальными синтаксическими конструкциями (ключевыми словами и т.д.), которые позволяют описывать группу понятий/подходов, которые являются общими для разных языков программирования (обычно какие-то возможности или идеи сначала появлются в одном языке программирования, а потом перекочовывают в другие, т.к. языки программирования часто влияют друг на друга).
Далее мы начнем знакомиться с основными из этих понятий, активно используя примеры кода
Привет ООП! Начало работы с классами. Методы, конструктор, создание объекта
Класс — это достаточно сложный, но тем не менее просто тип данных, который объявляется в секции type (подобно тому как мы это делаем для массивов или записей).
В отличие от записей и массивов классы не просто хранят данные, они могут действовать 😉
Давайте начнем именно с этого их свойства и рассмотрим пример:
type THelloWorld = class // объявляем класс public // секция публичных — общедоступных элементов класса procedure sayHello; // c единственным методом: процедурой end; procedure THelloWorld.sayHello; // описываем реализацию процедуры begin writeln(‘Привет Мир!’); end; var primer: THelloWorld; // переменная типа класса THelloWorld begin < создаем объект = «экземпляр класса» THelloWorld вызовом стандартного метода-конструктора create() >primer := THelloWorld.create(); // вызываем метод, который должен здоровься primer.sayHello(); end.
- Метод — это подпрограмма (в Паскале — процедура или функция), которая относится к какому-либо классу и его объектам.
- Как связаны «класс» и «объект»: класс — это тип для объекта, по аналогии, напр. с тем, что конкретный автомобиль является экземпляром класса своей модели. Объект также называют «экземпляром класса» (эти термины в документации часто значат одно и то же).
- Конструктор — специальный метод, который создает экземпляр класса. Можно сказать, что конструктор как бы строит объект в памяти компьютера, выделяя ее в нужных количествах и заполняя необходимымми структурами, а чертежом/проектом для этого строительства как раз и служит класс, в которому конструируемый объект относится.
- В примере выше использован стандартный конструктор create() (еще такие конструкторы называют конструкторами по умолчанию) — мы нигде не определяли его, но изначально есть у любого класса в Паскале, потому и называется стадартным
(такой же подход с наличием стандарного неявно определяемого конструктора используется и во многих других ЯП).
Поля класса — хранение данных. Обращение к собственным полям из методов класса
Выше на очень простом примере мы посмотрели, как классы и их объекты могут действовать (например здороваться).
Теперь пришло прям обсудить вторую их очень важную особенность — хранение данных. В этом они очень похожи на ранее изученный нами тип записей.
Давайте слегка модифицируем ранее изученный пример так, чтобы задействовать в работе кода поля класса:
type THelloWorld = class public whatToSay: string; // поле строкового типа procedure sayHello; end; procedure THelloWorld.sayHello; begin writeln(self.whatToSay); // поле класса в качестве аргумента процедуре печати end; var primer: THelloWorld; // переменная типа класса THelloWorld begin primer := THelloWorld.create(); primer.whatToSay := ‘Привет Вася. ‘; primer.sayHello(); end.
- программа делает все то же самое, но тут мы используем добавленное нами же свойство whatToSay (переводится как «что говорить»), в которое можно записать любую фразу, которую мы хотим использовать для приветствия, это позволяет менять поведение объекта после создания из тела программы.
- Поля класса — это переменные, связанные с классом (и созданными по его схеме объектами), в них могут лежать данные любого, допустимого для данной программы типа
Использование нестандартного конструктора. Передача параметров конструируемому объекту
В реальной разработке данные необходимые объекту для его работы часто передают прямо на этапе конструирования, в этом случае конструктор по-умолчанию нам не подходит. необходимо объвить свой.
Давайте изучим пример, в котором это как раз и делается:
type THelloWorld = class public whatToSay: string; // объявляем нестандартный конструктор constructor create(whatToSayValue: string); procedure sayHello; end; procedure THelloWorld.sayHello; begin writeln(self.whatToSay); end; // Добавляем реализацию собственного конструктора constructor THelloWorld.create(whatToSayValue: string); begin self.whatToSay := whatToSayValue; end; var primer: THelloWorld; // переменная типа класса THelloWorld begin primer := THelloWorld.create(‘Привет мир. ‘); primer.sayHello(); end.
- Мы сразу, прямо в конструктор передаем аргумент строкового типа
- Конструктор реализован таким образом, что записывает переданный аргумент в поле объекта whatToSay и именно это поле использует в своей реализации метод sayHello()
Пример №1 — разбиение/разделение решения на методы внутри класса
Пользователь передает целое положительное число $N$, выведете на экран последовательность от $1$ до $N$ «ёлочкой», например для $N = 18$:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
— оформить решения задачи (способом «одним циклом») в виде класса, который:
- получает на выход все значения, необходимые для вывода последовательности
- вынести определение необходимости переноса строки и сам перенос в отдельный метод
type Elka = class public count: integer; constructor create(n: integer); procedure newLineIfNeeded(var k, m: integer); procedure show(); end; constructor Elka.create(n: integer); begin self.count := n; end; procedure Elka.newLineIfNeeded(var k, m: integer); begin if (k = m) then begin writeln(); m+=1; // ожидаем на 1 один элемент больше в следующей строке k:=0; end; end; procedure Elka.show(); var i, m, // ожидаемая длина строки k // текущая длина строки :integer; begin m:=1; k:=0; for i:=1 to self.count do begin write(i, ‘ ‘); k+=1; self.newLineIfNeeded(k, m); end; end; var n, i, m, // ожидаемая длина строки k // текущая длина строки :integer; ElkaItem: Elka; begin n:= 10; // вводит пользователь // —— Решение с ООП: ElkaItem := Elka.create(n); ElkaItem.show(); // ——Решение без ООП (одним циклом): m:=1; k:=0; for i:=1 to n do begin write(i, ‘ ‘); k+=1; if (k = m) then begin writeln(); m+=1; // ожидаем на 1 один элемент больше в следующей строке k:=0; end; end; end.
— для лучше понимания можно посмотреть видео-разбор этого решения.
Видео-материалы
- Фрагмент лекции — Введение в ООП в Паскале: https://youtu.be/srEed_D_ABc
Задачи для самостоятельного решения
-
Ответьте на вопросы:
- Что такое класс? Что такое объект? Как они связаны и чем отличаются?
- Что такое метод класса? Чем именно могут быть методы в Паскале?
- Что такое поля класса? Для чего нужны?
- Что такое конструктор?
1 1 1 1 1 1 1 1
- решает задачу вызовом метода do() (без параметров)
- в конструктор принимает значения M и N (и хранит их в виде собственных полей)
- для вывода строки с указанным количеством единиц использует отдельный метод str(), работающий с ранее сохраненными параметрами.
- Напишите класс, который будет принимать в конструкторе, параметры, которые нужны для вывода последовательности
- Пусть за вывод возрастающего фрагмента отвечает отдельный метод
- За вывод тройки тоже пусть отвечает отдельный метод
- Клиентский код, должен иметь возможность вывести последовательность в консоль вызовом одного метода do() без параметров
Что еще почитать
- Freepascal Class docs: https://wiki.freepascal.org/Class
- Castle Engine — Modern Pascal Classes: https://castle-engine.io/modern_pascal#_.
Источник: fkn.ktu10.com
wiki.eduVdom.com

Записаться
на занятия (831) 247 47 55
eduVdom.com
Pascal
Контакты
eduVdom.com
+7 910 874 73 73
+7 904 064 04 04
Больше контактов.
Оставить отзыв.
subjects:programming:pascal:oop
Объектно-ориентированное программиирование ( ООП ) — методология программирования, основанная на представлении программы в виде совокупности объектов 1) , каждый из которых является экземпляром определённого класса 2) , а классы образуют иерархию наследования 3) . 4)
Записи
Запись представляет собой набор элементов разных типов, каждый из которых имеет свое имя и называется полем записи.
Описание записей
Тип записи в классическом языке Паскаль описывается следующим образом:
record описания полей end
где описания полей имеет такой же вид, что и раздел описания переменных без ключевого слова var .
Пример
type Person = record Name: string; Age: integer; end;
PascalABC.NET
Записи в PascalABC.NET имеет вид:
record секция1 секция2 . end
Каждая секция имеет вид:
модификатор доступа описания полей объявления или описания методов и описания свойств
Отличие записей от классов
Запись представляет собой размерный тип.
Записи нельзя наследовать; от записей также нельзя наследовать.
В записи по умолчанию подразумевается модификатор public (все члены открыты), а в классе — internal.
Объекты и классы
Описание классов
Класс представляет собой составной тип, состоящий из полей (переменных), методов (процедур и функций) и свойств. Описание класса имеет вид:
type имя класса = class секция1 секция2 . end;
Каждая секция имеет вид:
модификатор доступа описания полей объявления или описания методов и описания свойств
Модификатор доступа в первой секции может отсутствовать, при этом подразумевается модификатор internal (видимость всюду внутри сборки). Все описания и объявления внутри класса образуют тело класса. Поля и методы образуют интерфейс класса.
Классы могут описываться только на глобальном уровне. Локальные определения классов (т.е. определения в разделе описания подпрограмм) запрещены.
Пример
Методы
Методы представляют собой процедуры и функции, объявленные внутри класса или записи. Особыми разновидностями методов являются конструкторы, деструкторы и перегруженные операции.
Методы могут описываться как внутри, так и вне класса.
Свойства
Свойство внешне выглядит как поле класса, однако, при доступе к нему на чтение или запись позволяет выполнять некоторые действия. Свойство описывается в классе следующим образом:
property Prop: тип read имя функции чтения write имя процедуры записи;
Как правило, каждое свойство связано с некоторым полем класса и возвращает значение этого поля с помощью функции чтения, а меняет — с помощью процедуры записи. Функция чтения и процедура записи должны быть методами этого класса и иметь следующий вид:
function getProp: тип; procedure setProp(v: тип);
Обычно функция чтения и процедура записи описываются в приватной секции класса. Они могут быть виртуальными, в этом случае их уместно описывать в защищенной секции класса.
Свойства не могут передаваться по ссылке в процедуры и функции. Например, следующий код ошибочен:
Inc(p.Age); // ошибка!
Наследование
Класс может быть унаследован от другого класса. Класс, от которого наследуют, называют базовым классом (надклассом, предком), а класс, который наследуется, называется производным классом (подклассом, потомком).
При наследовании все поля, методы и свойства базового класса переходят в производный класс, кроме этого, могут быть добавлены новые поля, методы и свойства и переопределены (замещены) старые методы. Конструкторы наследуются по особым правилам.
Полиморфизм – это свойство классов, связанных наследованием, иметь различную реализацию входящих в них методов, и способность переменной базового класса вызывать методы того класса, объект которого содержится в этой переменной в момент вызова метода.
Объект — некоторая сущность в компьютерном пространстве, обладающая определённым состоянием и поведением, имеющая заданные значения свойств (атрибутов) и операций над ними (методов).
Термины « экземпляр класса » и « объект » взаимозаменяемы.
Класс — это элемент ПО, описывающий абстрактный тип данных и его частичную или полную реализацию.
Наследование — концепция ООП, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию компонентов ПО.
Грэди Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на С++ = Object-Oriented Analysis and Design with Applications / Пер. И.Романовский, Ф.Андреев. — 2-е изд. — М., СПб.: «Бином», «Невский диалект», 1998. — 560 с. — 6000 экз. — ISBN 5-7989-0067-3.
Источник: www.wiki.eduvdom.com