А. А. Волосевич
ООП НА ЯЗЫКЕ OBJECT PASCAL
Курс лекций
для студентов специальности
1-40 01 03 Информатика и технологии программирования
Минск 2012
Содержание
1. Базовые понятия ООП.. 3
2. Создание и уничтожение объектов. 5
3. Параметр self 9
4. Ограничение видимости элементов класса. 10
5. Свойства. 13
6. Отношения между классами. 18
7. Перекрытие методов. 19
8. Полиморфизм. 21
9. RTTI и размещение объектов в памяти. 26
10. Обработчики событий и указатели на методы.. 28
Литература. 32
Базовые понятия ООП
При разработке программ возможно использование нескольких подходов. Императивное[1] программирование подразумевает разработку программы методом последовательного уточнения и детализации. Исходная задача разбивается на несколько связанных подзадач, затем каждая подзадача делится на более мелкие подзадачи. Этот процесс продолжается вплоть до элементарных команд («присвой значение переменной», «выполни функцию» – отсюда и название стиля программирования). Однако усложнение программных продуктов потребовало новой методики написания программ. Выход был найден, когда в программировании применили принципы реального мира. В повседневной жизни мы сталкиваемся с множеством объектов («автомобиль», «дом», «улица»), наблюдаем их взаимодействие, и сами взаимодействуем с ними. Объектно-ориентированное программирование (ООП) предполагает представление программы как процесса взаимодействия некоторых вполне самостоятельных единиц, по аналогии с реальным миром называемых объектами. Работа программиста в этом случае заключается в наиболее полном описании набора объектов задачи и кодировании их связей. Подобный стиль программирования позволяет существенно сократить время разработки сложных программ и программных комплексов. Упрощается также сопровождение и отладка программ. ООП оказалось настолько продуктивной идеей, что большинство современных языков программирования являются либо чисто объектно-ориентированными (Java, C#, Visual Basic.NET), либо содержат средства ООП в качестве надстройки (C++, Object Pascal).
ООП основывается на трёх принципах: инкапсуляция, наследование, полиморфизм. Рассмотрим первый из них. Инкапсуляция – это логическое объединение в одном программном типе, называемом класс, как данных, так и подпрограмм для их обработки. Данные класса хранятся в полях класса, подпрограммы для работы с полями называются методами класса.
Разберём синтаксис определения класса в Object Pascal. В качестве примера рассмотрим класс для представления информации о человеке:
type TPerson = class
fName: string;
fAge: Integer;
procedure SetAge(Age: Integer);
function SayName: string;
end;
Определение класса размещается в секции описания типов. Это может быть глобальная секция типов программы, секция типов в интерфейсной части модуля или в разделе реализации, но не секция типов в подпрограмме. Для определения класса используется ключевое слово class. Вначале описываются поля класса. Полями класса TPerson являются fName и fAge[2]. После описания всех полей следует указание методов класса. Методы TPerson – это процедура SetAge и функция SayName. Класс содержит только заголовки методов, реализация методов описывается отдельно. Если класс описан в модуле, реализация методов должна находиться в том же модуле в секции implementation. Чтобы показать, что подпрограмма является реализацией метода класса, используется синтаксис имя-класса.имя-метода. В теле методов обращение к полям класса происходит без указания каких-либо дополнительных спецификаторов:
procedure TPerson.SetAge(Age: Integer);
begin
if Age > 0 then fAge:= Age
end;
function TPerson.SayName: string;
begin
Result:= 'My name is ' + fName
end;
После того как класс описан, можно объявить переменную класса, называемую экземпляром класса или объектом:
var Man: TPerson;
В реальной жизни классу соответствует абстрактное понятие, которое конкретизируется в своих проявлениях. Так, класс TPerson как бы пытается описать человека вообще, его параметры и действия, производимые им и над ним. Объект Man – это уже конкретный человек, и конкретизировать его можно через значения полей.
В Object Pascal для работы с полями и методами объекта используется синтаксис имя-объекта.имя-поля-или-метода. Это напоминает работу с переменной типа запись:
Man.fName:= 'John Dow';
Man.SetAge(35);
writeln(Man.SayName, Man.fAge);
Приведём полный пример консольного приложения, содержащего определение класса и демонстрирующего работу с объектами:
program FirstOOPProgramm;
{$APPTYPE CONSOLE}
type TPerson = class
fName: string;
fAge: Integer;
procedure SetAge(Age: Integer);
function SayName: string;
end;
procedure TPerson.SetAge(Age: Integer);
begin
if Age > 0 then fAge:= Age
end;
function TPerson.SayName: string;
begin
Result:= 'My name is ' + fName
end;
var Man: TPerson;
begin
Man:= TPerson.Create; // создание объекта
Man.fName:= 'John Dow';
Man.SetAge(36);
writeln(Man.SayName, Man.fAge);
end.