- •Оглавление
- •Виды данных
- •Программирование линейных алгоритмов
- •Программирование разветвляющихся алгоритмов
- •Программирование циклических алгоритмов
- •Описание и использование типа массив
- •Ввод и вывод массивов
- •Процедуры и функции для работы со строками
- •Описание и использование данных строкового типа
- •Операции над строками
- •Описание и использование процедур и функций
- •Функции
- •Формальные и фактические параметры
- •Описание и использование типа запись
- •Описание и использование множеств
- •Файловый тип данных. Описание и использование типизированных файлов
- •Описание и использование текстовых файлов
- •Модуль пользователя
- •Объектно-ориентированное программирование. Классы. Основные понятия
- •Основные понятия
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Составляющие класса Поля
- •Свойства
- •Программные файлы. Файл проекта. Файл формы
- •Система программирования Delphi
- •Основные окна Delphi
- •Литература
Основные понятия
В основе классов лежат три фундаментальных принципа – это инкапсуляция, наследование и полиморфизм.
Инкапсуляция
Класс представляет собой единство трех сущностей – полей, методов и свойств. Объединение этих сущностей в единое целое и называется инкапсуляцией. Инкапсуляция – объединение в единое целое данных и операций над ними. Инкапсуляция позволяет изолировать класс от остальных частей программы, сделать его самодостаточным для решения конкретной задачи. Например, класс TForm содержит все необходимое для создания Windows окна, класс TMemo представляет собой полнофункциональный текстовый редактор.
type Сomp= class(TObject)
Re,Im:real; {поля}
procedure Add(x,y:Сomp; var z:Comp); {метод}
end;
var c: Сomp;
Экземпляр объекта типа Сomp представляет собой переменную комплексного типа, ее значениями являются пары вещественных чисел – вещественная и мнимая части. Для типа Сomp определен метод Add – сложение комплексных чисел.
Наследование
Любой класс может быть порожден от другого класса. Для этого при его объявлении указывается имя класса родителя:
TChildClass=class(TParentClass)
Порожденный класс автоматически наследует поля, методы и свойства своего родителя и может дополнять их новыми. Принцип наследования обеспечивает поэтапное создание сложных классов и разработку собственных библиотек классов. Все классы Object Pascal порождены от единственного родителя – класса TObject. Этот класс не имеет полей и свойств, но включает в себя методы самого общего назначения, обеспечивающие весь жизненный цикл любых объектов – от их создания до удаления. Следующие два описания идентичны:
TaClass=class(TObject) и TaClass=class
Принцип наследования приводит к созданию ветвящегося дерева классов, постепенно разрастающегося от класса TObject к его потомкам. Каждый потомок дополняет возможности своего родителя новыми и передает их своим потомкам.
type Comp2=class(Comp)
procedure Radical;
end;
Описание типа Comp2 дополняет методы типа Comp еще одним методом Radical.
Полиморфизм
Полиморфизм – это свойство родственных классов решать схожие по смыслу проблемы разными способами. В Object Pascal свойства класса определяются набором входящих в него методов. Изменяя алгоритм метода в потомках класса, можно придавать этим потомкам отсутствующие у родителя специфические свойства. Для изменения метода необходимо перекрыть (переопределить) его в потомке, то есть объявить в потомке одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющие разную алгоритмическую основу и, следовательно, придающие объектам разные свойства. Это и называется полиморфизмом объектов.
Составляющие класса Поля
Полями называются инкапсулированные в классе данные. Поля могут быть любого типа, в том числе классами, например:
type TMyClass=class
a:integer; {поле целого типа}
b:string; {поле строкового типа}
c:TObject {поле типа класс}
end;
Каждый объект получает свой набор полей, но общий для вcех объектов данного класса набор методов и свойств. Фундаментальный принцип инкапсуляции требует обращаться к полям только с помощью методов и свойств класса, но Object Pascal разрешает обращаться к полям напрямую:
var Obj:TMyClass;
begin
Obj.a:=0; Obj.b:=’строка’;
end;
Класс-потомок получает все поля всех своих предков и может дополнять их новыми, но он не может переопределять существующие или удалять их.
Методы
Инкапсулированные в классе процедуры и функции называются методами. Они объявляются, как и обычные подпрограммы.
type TMyClass=class
function Myfunc(a:integer):integer;
procedure Myproc;
end;
Доступ к методам класса, как и к его полям, возможен с помощью составных имен:
var Obj:TMyClass;
begin
Obj. Myproc; …
end;
В состав любого класса входят два специальных метода – конструктор и деструктор. У класса TObject эти методы называются Create и Destroy, так же они называются и у большинства его потомков. Конструктор распределяет объект в динамической памяти (куче) и помещает его адрес в переменную Self, которая автоматически объявляется в классе. Деструктор удаляет объект из кучи. По форме конструкторы и деструкторы являются процедурами, но объявляются с помощью слов Constructor и Destructor:
type TMyClass=class
field:integer;
Constructor Create(value:integer);
Destructor Destroy;
end;
Обращение к конструктору должно предварять любое обращение к полям и методам объекта:
имя объекта:=имя класса.имя конструктора;
В классе TObject определен метод Free, который сначала проверяет адрес объекта, затем вызывает деструктор Destroy. Обращение к деструктору объекта будет ошибочным, если объект не создан конструктором, поэтому для удаления объекта следует вызвать метод Free.
var MyObject:TMyClass;
begin
MyObject:=TMyClass. Create(0); {создается объект}
MyObject. field:=1; {обращение к полям объекта}
MyObject. free; {удаление объекта}
end;
Большинство конструкторов реализуют некоторые действия, необходимые для правильной работы объекта. Поэтому в конструкторе класса-потомка нужно вызвать конструктор его родителя, а затем осуществить дополнительные действия. Вызов любого метода родительского класса достигается указанием слова Inherited (унаследованный):
Constructor TMyClass.Сreate (value:integer);
begin
Inherited Create; {вызывается унаследованный конструктор}
field:=value; {реализуются дополнительные действия}
end;
