Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции_полный_часть1 (Восстановлен).docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.68 Mб
Скачать

Базовые принципы ооп

  ООП характеризуется тремя базовыми принципами:

  1. Инкапсуляция

  2. Наследование

  3. Полиморфизм

1.Инкапсуляция

Инкапсуляцией называется скрытие полей объекта с целью обеспечения доступа к ним только посредством методов класса.

Ограничение доступа к полям объекта реализуется в Delphi при помощи свойствобъекта.

Свойство объекта характеризуется

полем, сохраняющим значение свойства;

двумя методами, обеспечивающими доступ к полю свойства.

Методы, обеспечивающие доступ к полю свойства:

Метод установки значения свойства – метод записи свойства (write).

Метод получения значения свойства – метод чтения свойства (read).

Для описания свойства в определении класса указывают:

зарезервированное слово property;

имя свойства;

тип свойства;

имена методов, обеспечивающих доступ к значению свойства.

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

Например: разрешить только чтение свойства.

Чтобы инструкции программы не могли изменить значение свойства, нужно в описании свойства указать только имя метода чтения. В этом случае попытка присвоить значение свойству вызовет ошибку во время компиляции.

Установить значение свойства, защищенного от записи, можно во время инициализации объекта

Пример.

Описание класса TPerson, содержащего свойства Name и Address:

type

TName = string[15];

TAddress = string[50];

TPerson = class

private

fname: TName;

faddress: TAddress;

constructorCreate (Name: TName);

procedure Show;

functionGetName: TName;

functionGetAddress: TAddress;

procedureSetAddress (NewAddress: TAddress);

public

property Name: TName

readGetName;

property Address: TAddress

readGetAddresswriteSetAddress;

Свойство Name доступно только для чтения. Свойство Addressдоступно для чтения и для записи.

Методы класса TPerson, обеспечивающие создание объекта этого класса и доступ к его свойствам.

конструктор объекта TPerson:

constructorTPerson.Create (Name: TName);

begin

fname := Name;

end;

метод получения значения свойства Name:

functionTPerson.GetName;

begin

result := fname;

end;

метод получения значения свойства Address:

functionTPerson.GetAddress;

begin

result := faddress;

end;

метод изменения значения свойства Address:

procedureTPerson.SetAddress(NewAddress:TAddress);

begin

iffaddress = ‘’

thenfaddress := NewAddress;

end;

Чтобы присвоить значение свойству Address объекта student, в программе достаточно использовать инструкцию

student.Address := ‘г. Тюмень, ул. Мельникайте, 75, кв. 6’

Компилятор преобразует эту инструкцию в инструкцию вызова метода

student.SetAddress(‘г. Тюмень, ул. Мельникайте, 75, кв. 6’)

Таким образом, инструкции, обеспечивающие создание объекта класса TPerson и установку его свойств, могут выглядеть так:

student := TPerson.Create(‘ИвановА.А.’);

student.Address := ‘г. Тюмень, ул. Мельникайте, 75, кв. 6’

2.Наследование

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

Такой механизм получения новых классов называется порождением.

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

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

  • Пример.

Реализация конструктора класса TProfessor:

constructorTProfessor.Create(Name: TName; dep: string);

begin

inherited Create(Name);

fdepartment := dep;

end;

После создания объекта класса-потомка в программе можно использовать поля и методы родительского класса.

  • Пример.

Фрагмент программы, демонстрирующий указанную возможность:

Создание объекта класса

professor := TProfessor.Create(‘Петров’, ‘ММФ’);

установка значения свойства родительского класса

professor.Address := ‘ул. Ленина, 210, кв.11’;

применение метода родительского класса

professor.Show;

Директивы

protected (защищенный) и

private (закрытый)

устанавливают степень видимости элементов класса в программе.

Элементы класса, объявленные в секции protected, доступны только в классах, порожденных от данного класса.

Область видимости этих элементов не ограничивается модулем, в котором находится описание класса.

Обычно в секцию protected помещают описание методов класса.

Элементы класса, объявленные в секции private, видимы только внутри модуля.

Эти элементы не доступны за пределами модуля, даже в производных классах.

Обычно в секцию private помещают описание полей класса, а методы, обеспечивающие доступ к этим полям, – в секцию protected.

Описание класса TPerson, включающее директивы управления доступом:

TPerson = class

private

fname: TName;

faddress: TAddress;

protected

constructorCreate (Name: TName);

procedure Show;

functionGetName: TName;

functionGetAddress: TAddress;

procedureSetAddress (NewAddress: TAddress);

property Name: TName

readGetName;

property Address: TAddress

readGetAddresswriteSetAddress;

end;

3.Полиморфизм

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

Концепция полиморфизма обеспечивает применение к объекту именно того метода, который соответствует классу объекта.

Если в описании родительского класса метод объявлен как виртуальный (директива virtual), то каждый класс-потомок имеет возможность заменить виртуальный метод своим собственным методом.

Эта замена выполняется с помощью директивы override.

  • Пример.

Рассмотрим определение трех классов:

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);

functionInfo: string; override; замещение метода родительского класса

end;

класс-потомок TStudent = class (TPerson)

fgroup: integer;

constructor Create (Name, Address: string: Group: Integer);

functionInfo: string; override; замещение метода родительского класса

end;

Определение метода Info для каждого класса (в разделе Implementation):

functionTPerson.Info: string;

begin

result := ‘’;

end;

functionTProfessor.Info: string;

begin

result := fname + ‘ кафедра ‘ + fdepartment;

end;

functionTStudent.Info: string;

begin

result := fname + ‘ группа ‘ + IntToStr(fgroupe);

end;

Пример для закрепления

Type

Coordinates = class

x, y : byte;

procedure Init (Xinit, Yinit: byte);

function GetX : byte;

function GetY : byte;

end;

Type

Cursor = class (coordinates)

Hidden : Boolean;

end;

Закрепление к лекции 6

Лекция 7

Тема: Компоненты и их свойства и методы.

Вопросы: