Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
freePascal 2.0_0.doc
Скачиваний:
13
Добавлен:
01.05.2025
Размер:
343.55 Кб
Скачать

Основы объектно-ориентированного программирования

В данном параграфе мы рассмотрим основы объектно-ориентированного программирования (ООП). ООП - это методика разработки программ, в основе которой лежит понятие объекта, как некоторой структуры, описывающей объект реального мира, его поведение и взаимодействие с другими объектами.

Основные понятия

Основой объектно-ориентированного программирования является объект.

Объект состоит из трех основных частей:

1) имя (например, компьютер);

2) состояние или переменные состояния (например, название компьютера, цвет, количество оперативной памяти и т.д.);

3) методы (операции), которые выполняют некоторые действия над объектами и определяют, каким образом объект взаимодействует с окружающим миром.

Для работы с объектами в языке программирования Free Pascal существует понятие класса.

Класс - сложная структура, которая включает в себя описание данных, процедуры и функции, которые могут быть выполнены над объектом.

Классом называется составной тип данных, элементами которого являются подпрограммы и переменные (поля). Свойства объектов описываются с помощью переменных (полей) классов, а действия над объектами описываются с помощью подпрограмм (методов класса). Объекты называются экземплярами класса.

Объектно-ориентированное программирование представляет собой технологию разработки программ с использованием объектов. В объектно-ориентированных языках есть три основных понятия: инкапсуляция, наследование и полиморфизм.

Инкапсуляция - объединение в классе данных и подпрограмм для их обработки.

Наследование - это возможность порождения любого класса, другим классом. Порожденный класс (наследник) автоматически наследует все поля, методы, свойства и события.

Полиморфизм позволяет использовать одинаковые имена для методов, входящих в различные классы.

Для объявления класса используется конструкция:

type

название класса = class (имя класса родителя)

поля и методы класса

private

поля и методы, доступные только в пределах модуля

protected

поля и методы, доступные только в классах-потомках

public

поля и методы, доступные из других модулей

end;

В качестве имени класса можно использовать любой допустимый в Free Pascal идентификатор. Имя класса родителя - имя класса, наследником которого является данный класс, это необязательный параметр, если он не указывается, то это означает, что данный класс является наследником общего из предопределенного класса TObject.

При использовании классов могут быть члены, доступные везде- публичные (описатель public), и приватные (описатель private), доступ к которым возможен только с помощью публичных методов. Это также относится и к методам класса.

Поля, свойства и методы секции public не имеют ограничений на видимость. Они доступны из других функций и методов объектов как в данном модуле, таки во всех прочих, ссылающихся на него. При обращении к публичным полям вне класса используется оператор «.». Поля, свойства и методы, находящиеся в секции private, доступны тольков методах класса и в функциях, содержащихся в том же модуле, что и описываемый класс. Это позволяет полностью скрыть детали внутренней реализации класса. Вызов приватных методов осуществляется из публичных.

Защищенный (protected) - это раздел, содержащий поля и методы, которые доступны внутри класса, а также любым его классам - потомкам, в том числе и в других модулях.

Поля и методы, описанные до указания имени секции, являются публичными (public).

При программировании с использованием классов, программист должен решить, какие члены и методы должны быть объявлены публичными, а какие приватными. Уменьшение количества публичных членов и методов позволяет минимизировать количество ошибок.

Поля могут быть любого типа, в том числе и классами.

Объявление полей осуществляется так же, как и объявление обычных переменных:

поле1 : тип данных ;

поле2 : тип данных ;

. . .

Методы в классе объявляются так же, как и обычные подпрограммы:

function метод1 (список параметров) : тип результата;

procedure метод2 (список параметров);

Описание процедур и функций, реализующих методы, помещается после слова implementation того модуля, где объявлен класс, и выглядит так:

function имя класса.метод1(список параметров ) : тип результата ;

begin

тело функции;

end;

procedure имя класса.метод2(список параметров ) ;

begin

тело функции;

end;

Объявление переменной типа class называется созданием (инициализацией) объекта (экземпляра класса). Экземпляр класса объявляется в блоке описания переменных:

var имя переменной : имя класса ;

После описания переменной в программе можно обращаться к полям и методам класса аналогично обращению к полям структуры, используя, оператор «.».

Например:

имя переменной.поле1:=выражение;

имя переменной.метод1(список параметров );

. . .

Также можно использовать оператор With:

with имя переменной do

begin

поле1:=выражение;

метод1(список параметров );

. . .

end;

Конструктор - это специальный метод, создающий и инициализирующий объект. Объявление конструктора имеет вид:

constructor create;

Описывают конструктор так же, как и другие методы, после ключевого слова implemention того модуля, в котором объявлен класс.

constructor имя класса.сreate ;

begin

поле1:=выражение1;

поле2:=выражение2;

. . .

inherited Create ;

end;

В результате работы конструктора инициализируются все поля класса, при этом порядковым типам в качестве начальных значений задаются 0, а строки задаются пустыми.

Деструктор - это специальный метод, уничтожающий объект и освобождающий занимаемую им память. Объявляется деструктор следующим образом:

destructor Destroy;

Для того чтобы освободить память от объектов, которые больше не используются в программе используется метод .free.

Для того чтобы создавать и использовать классы в программе необходимо использовать директиву mode objfpc.

Задача.

Создадим класс: «вывод двух чисел на экран», поля класса – 2 числа, метод класса – вывод чисел на экран. Напишем простую программу создающую экземпляр заданного класса.

{$mode objfpc}

uses Classes;

type primer = class(TObject)

private

a,b: integer;

public

constructor create(c,d:integer);

procedure print;

end;

constructor primer.create(c,d:integer);

begin

a:=c;

b:=d;

inherited create;

end;

procedure primer.print;

begin

writeln('a=',a);

writeln('b=',b);

end;

var obj1:primer;

x,y:integer;

begin

writeln(‘Введите 2 числа’);

readln(x,y);

obj1:=primer.Create(x,y);

obj1.print;

obj1.a:=100;

writeln(obj1.a);

obj1.free;

readln;

end.

Задания для самостоятельной работы.

    1. Создать класс «круг». Поля класса: радиус. Методы класса: длина окружности, площадь.

    2. Создать класс «простой калькулятор». Поля класса: два вещественных числа. Методы класса: сложение, вычитание, умножение, деление чисел.

    3. Создать класс «генератор квадратной матрицы заданной размерности». Поля класса: размерность матрицы. Методы класса: вывод матрицы, заполненной случайными числами, на экран.

    4. В задачу 3 добавить методы: сумма элементов матрицы, среднее арифметическое элементов матрицы.

    5. В задачу 4 добавить методы: нахождение максимального и минимального элемента матрицы.

    6. *В задачу 5 добавить метод: нахождение обратной матрицы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]