3 Объектно-ориентированное программирование.ppt
- Количество слайдов: 46
Введение в объектноориентированное программирование
Процедурный подход Исторически программирование возникло и развивалось как процедурное программирование. Процедурный подход: основой программы является алгоритм, процедура обработки данных. Развитие этого подхода – модульное программирование: программный код можно разбить на несколько файлов, каждый из которых является коллекцией подпрограмм. Но модульность не меняет принципиально подход процедурного программирования.
Процедурный подход не всегда соответствует пониманию реального мира, моделируемого в программе. n Пример. Мы говорим: «Машина едет» , а не говорим, что есть функция «ехать» , которая применяется к машине. Предполагается, что у машины есть способность перемещаться, которая является ее неотъемлемой частью. Требуется объединить данные (машину) и функции (способность ехать и т. п. ). Такое объединение – в основе объектноориентированного программирования.
Объектно-ориентированное программирование (ООП) – это методика разработки программ, в основе которой лежит понятие «объект» . Объект – некоторая структура, соответствующая объекту реального мира, его поведению. Программа при таком подходе представляет собой набор объектов и связей между ними.
Основные понятия n Класс – это сложная структура, включающая, помимо описания данных, описание процедур и функций, которые могут быть выполнены над представителями класса. n Объект – это экземпляр (представитель) класса. n Данные класса называются полями, процедуры и функции - методами.
Описание класса помещается в программе в раздел описания типов (type). n Пример. Объявление простого класса: type TPerson = class private Имя класса fname: string[15]; faddress: string[50]; Имена public полей procedure Show; end; Имя метода
Объекты как представители класса объявляются в программе в разделе var. n Пример. var student: Tperson;
Переменная-объект содержит не данные, а ссылку на данные объекта. Необходимо позаботиться о выделении памяти для этих данных. Выделение памяти осуществляется с помощью специального метода класса – конструктора. Объявление конструктора: constructor Имя_конструктора (<параметры>); Обычно конструктору присваивается имя Create.
n Пример. Объявление класса TPerson, в состав которого введен конструктор: type TPerson = class private fname: string[15]; faddress: string[50]; constructor Create; Конструктор public procedure Show; end;
После выполнения инструкции student : =TPerson. Create; будет выделена необходимая память для данных объекта student.
Кроме выделения памяти конструктор часто осуществляет инициализацию объекта – присваивание полям объекта начальных значений. n Пример. Реализация конструктора для объекта класса TPerson: constructor TPerson. Create; begin fname : = ‘’; faddress : = ‘’; end;
После объявления и инициализации объект можно использовать. Доступ к полю объекта: Имя_объекта. имя_поля n Пример: student. fname : = ‘Иванов’;
Если объект больше не используется в программе, то можно освободить память, занимаемую полями данного объекта. Для этого используется метод-деструктор Free. n Пример. Освобождение памяти, занимаемой полями объекта student: student. Free;
Методы класса – процедуры и функции, объявление которых включено в описание класса. Выполняют действия над объектами класса. Инструкция для применения метода к объекту: Имя_объекта. имя_метода; Фактически, это способ записи инструкции вызова процедуры.
Методы класса определяются в программе так же, как обычные процедуры и функции, за исключением того, что имя процедуры или функции, являющейся методом, состоит из двух частей: имени класса, которому принадлежит метод, и имени метода: Имя_класса. имя_метода В инструкциях метода доступ к полям объекта осуществляется без указания имени объекта.
n Пример. Определение метода Show класса TPerson: Procedure TPerson. Show; begin Show. Message(‘Имя ‘ + fname + #13 + ‘Адрес ‘ + faddress); end; Инструкция student. Show; вызовет применение метода Show к объекту student.
Инкапсуляция и свойства объекта Инкапсуляцией называется скрытие полей объекта с целью обеспечения доступа к ним только посредством методов класса. Ограничение доступа к полям объекта реализуется в Delphi при помощи свойств объекта. Свойство объекта характеризуется ¨ полем, сохраняющим значение свойства; ¨ двумя методами, обеспечивающими доступ к полю свойства.
Методы, обеспечивающие доступ к полю свойства: ¨ Метод установки значения свойства – метод записи свойства (write). ¨ Метод получения значения свойства – метод чтения свойства (read).
Для описания свойства в определении класса указывают: ¨ зарезервированное ¨ имя свойства; ¨ тип слово property; свойства; ¨ имена методов, обеспечивающих доступ к значению свойства.
Оформление данных объекта как свойства позволяет ограничить доступ к соответствующим полям. Например: разрешить только чтение свойства. Чтобы инструкции программы не могли изменить значение свойства, нужно в описании свойства указать только имя метода чтения. В этом случае попытка присвоить значение свойству вызовет ошибку во время компиляции. Установить значение свойства, защищенного от записи, можно во время инициализации объекта.
n Пример. Описание класса TPerson, содержащего свойства Name и Address: Свойство Name доступно только для чтения Свойство Address доступно для чтения и записи type TName = string[15]; TAddress = string[50]; TPerson = class private fname: TName; faddress: TAddress; constructor Create (Name: TName); procedure Show; function Get. Name: TName; function Get. Address: TAddress; procedure Set. Address (New. Address: TAddress); public property Name: TName read Get. Name; property Address: TAddress read Get. Address write Set. Address; end;
Методы класса TPerson, обеспечивающие создание объекта этого класса и доступ к его свойствам. ¨ конструктор объекта TPerson: constructor TPerson. Create (Name: TName); begin fname : = Name; end; ¨ метод получения значения свойства Name: function TPerson. Get. Name; begin result : = fname; end;
¨ метод получения значения свойства Address: function TPerson. Get. Address; begin result : = faddress; end; ¨ метод изменения значения свойства Address: procedure TPerson. Set. Address(New. Address: TAddress); begin if faddress = ‘’ then faddress : = New. Address; end;
Чтобы присвоить значение свойству Address объекта student, в программе достаточно использовать инструкцию student. Address : = ‘г. Тюмень, ул. Мельникайте, 75, кв. 6’ Компилятор преобразует эту инструкцию вызова метода student. Set. Address(‘г. Тюмень, ул. Мельникайте, 75, кв. 6’)
Таким образом, инструкции, обеспечивающие создание объекта класса TPerson и установку его свойств, могут выглядеть так: student : = TPerson. Create(‘Иванов А. А. ’); student. Address : = ‘г. Тюмень, ул. Мельникайте, 75, кв. 6’
На методы свойства объекта можно возложить дополнительные задачи: ¨ проверку корректности присваиваемых свойству значений; ¨ установку значений других полей, логически связанных со свойством; ¨ вызов вспомогательной процедуры и т. п.
Наследование Концепция ООП предполагает возможность определять новые классы посредством добавления полей, свойств и методов к уже существующим классам. Такой механизм получения новых классов называется порождением. При этом новый, порожденный класс (потомок) наследует свойства и методы своего базового, родительского класса.
В объявлении класса-потомка указывается класс родителя. n Пример. Класс TProfessor может быть порожден от рассмотренного выше класса TPerson путем добавления поля fdepartment (факультет). Объявление класса TProfessor может выглядеть так: Класс-потомок Родительский класс TProfessor = class(TPerson) fdepartment: string; Добавленное constructor Create(Name: TName; dep: string); поле end;
Класс-потомок должен иметь собственный конструктор, обеспечивающий инициализацию класса-родителя и своих полей. n Пример. Реализация конструктора класса TProfessor: constructor TProfessor. Create(Name: TName; dep: string); begin inherited Create(Name); fdepartment : = dep; end; Директива вызова конструктора родительского класса
После создания объекта класса-потомка в программе можно использовать поля и методы родительского класса. n Пример. Фрагмент программы, демонстрирующий указанную возможность: Создание объекта класса TProfessor professor : = TProfessor. Create(‘Петров’, ‘ММФ’); professor. Address : = ‘ул. Ленина, 210, кв. 11’; professor. Show; Установка значения Применение метода родительского класса свойства родительского класса
Директивы protected и private Директивы protected (защищенный) и private (закрытый) устанавливают степень видимости элементов класса в программе.
Элементы класса, объявленные в секции protected, доступны только в классах, порожденных от данного класса. Область видимости этих элементов не ограничивается модулем, в котором находится описание класса. Обычно в секцию protected помещают описание методов класса.
Элементы класса, объявленные в секции private, видимы только внутри модуля. Эти элементы не доступны за пределами модуля, даже в производных классах. Обычно в секцию private помещают описание полей класса, а методы, обеспечивающие доступ к этим полям, – в секцию protected.
n Пример. Описание класса TPerson, включающее директивы управления доступом: TPerson = class private fname: TName; faddress: TAddress; protected constructor Create (Name: TName); procedure Show; function Get. Name: TName; function Get. Address: TAddress; procedure Set. Address (New. Address: TAddress); property Name: TName read Get. Name; property Address: TAddress read Get. Address write Set. Address; end;
Полиморфизм и виртуальные методы Полиморфизм – это возможность использовать одинаковые имена для методов, входящих в различные классы. Концепция полиморфизма обеспечивает применение к объекту именно того метода, который соответствует классу объекта.
Если в описании родительского класса метод объявлен как виртуальный (директива virtual), то каждый класс-потомок имеет возможность заменить виртуальный метод своим собственным методом. Эта замена выполняется с помощью директивы override. n Пример. Рассмотрим определение трех классов: TPerson – родительский класс, Tproffessor и TStudent – классы, порожденные от TPerson.
type Родительский класс TPerson = class fname: string; faddress: string; constructor Create (Name, Address: string); function Info: string; virtual; Объявление end; виртуального метода TProfessor = class (TPerson) fdepartment: string; Класс-потомок constructor Create (Name, Address, Dep: string); function Info: string; override; Замещение метода end; родительского класса TStudent = class (TPerson) fgroup: integer; Класс-потомок constructor Create (Name, Address: string: Group: Integer); function Info: string; override; Замещение метода end; родительского класса
Определение метода Info для каждого класса (в разделе Implementation): function TPerson. Info: string; begin result : = ‘’; end; function TProfessor. Info: string; begin result : = fname + ‘ кафедра ‘ + fdepartment; end; function TStudent. Info: string; begin result : = fname + ‘ группа ‘ + Int. To. Str(fgroupe); end;
Следующее приложение, используя рассмотренные выше объявления классов, формирует и выводит список студентов и преподавателей: Определяется выбором переключателя
Фрагмент кода, реализующий ввод данных и вывод списка на экран: Щелчок по кнопке «Добавить» procedure TForm 1. Button 1 Click(Sender: TObject); Тогда создается begin Установлен переключатель объект класса if Radio. Button 1. Checked «Преподаватель» TProfessor then List[N] : = TProfessor. Create(Edit 1. Text, Edit 3. Text, Edit 2. Text) else List[N] : = TStudent. Create(Edit 1. Text, Edit 3. Text, Str. To. Int(Edit 2. Text)); List 1[N]: = List[N]. Info; Обращение к методу Info Иначе создается (будет применен метод, N : = N+1; объект класса соответствующий классу TStudent Edit 1. Text : = ''; созданного объекта) Edit 2. Text : = ''; Edit 3. Text : = ''; Очищение полей ввода Edit 1. Set. Focus; end; Перевод курсора в поле ФИО
procedure TForm 1. Button 2 Click(Sender: TObject); var i: integer; Щелчок по кнопке begin «Вывести список» for i : = 0 to N-1 do List. Box 1. Items[i] : = List 1[i]; end; procedure TForm 1. Radio. Button 2 Click(Sender: TObject); begin Установка переключателя Label 2. Caption : = ‘Группа'; «Студент» end; end. Изменение поясняющего текста на форме
Классы и объекты Delphi Для реализации интерфейса Delphi использует обширную библиотеку разнообразных классов, поддерживающих форму и ее компоненты (поля ввода и редактирования, командные кнопки и т. п. ). Каждый класс Delphi является потомком класса TObject, даже если это не указано явно. Поэтому у каждого класса есть встроенные методы и свойства (унаследованные от родительского класса).
Небольшой фрагмент иерархии встроенных классов Delphi:
При добавлении компонентов на форму Delphi автоматически формирует описание класса формы и объявление необходимых объектов; при создании процедуры-обработчика события в описание класса формы добавляется объявление соответствующего метода.
n Пример. Описание класса формы, сгенерированное Delphi: unit Unit 1; interface uses Windows, Messages, Sys. Utils, Variants, Classes, Graphics, Controls, Forms, Std. Ctrls; type TForm 1 = class(TForm) Label 1: TLabel; Edit 1: TEdit; Label 2: TLabel; Edit 2: TEdit; Group. Box 1: TGroup. Box; Radio. Button 1: TRadio. Button; Radio. Button 2: TRadio. Button; Button 1: TButton; Button 2: TButton; procedure Button 1 Click(Sender: TObject); procedure Button 2 Click(Sender: TObject); procedure Radio. Button 2 Click(Sender: TObject); procedure Form. Create(Sender: TObject); end; Классы Delphi
Объявление объекта – формы приложения (объект класса TForm 1): var Form 1: TForm 1;
3 Объектно-ориентированное программирование.ppt