Выбери формат для чтения
Загружаем конспект в формате pptx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Лекция 5. Немного об
абстракциях
Абстрактный класс
Интерфейс
Вспомним о классе
Класс — это некое множество объектов,
имеющих общую ст рукт уру и общее
поведение.
Г. Буч
Абстрактный класс
Класс, имеющий хотя бы один абст ракт ны й
метод, называется абстрактным.
type
TShape = class
private
FPoints : TList;
public
function GetSquare:real; virtual; abstract;
end;
может быть
перегружен в
классахнаследниках
не имеет реализации
в данном классе
Зачем нужен абстрактный
класс?
• Позволяет выделить общую структуру
• Позволяет выделить общие аспекты
поведения
• Оперируем похожими объектами, не
зная деталей их устройства
• Определяем аспекты поведения на
стадии выполнения
Оперируем похожими объектами
var duck:TDuck; // объект абстрактного класса
for i:=0 to (Ducks.Count–1) do
begin
duck:=Ducks[i]; // уже не абстрактная, но реальная утка
duck.swim;
// однако она обладает методами
duck.fly;
// абстрактной утки
end;
Это все утки — а значит, они
могут плавать и летать!
А наша duck — полиморфна.
Определяем аспекты поведения
на стадии выполнения
var duck:TDuck; // объект абстрактного класса
begin
duck:=Pool.CatchRandomDuck; // ловим утку наугад
writeln(‘We catched ’+duck.Name);
duck.swim;
duck.fly;
end;
Каждая утка летает и плавает посвоему.
Мы не знаем, как именно поведет себя
пойманная утка. Снова
полиморфизм ;)
Наследование абстрактного класса
Ничем не отличается от обы чного
наследования. Не забудьте
перегрузить и реализовать методы,
чтобы наследник не был абстрактным!
type
TMyDuck = class(TDuck)
protected
procedure fly; override; // без директивы abstract
procedure swim; override; // реализация необходима!
end;
Интерфейс
Абстрактные классы — отличное
решение для обобщения общих
свойств и поведения! Зачем
изобретать что-то еще?
Интерфейс
• Класс, не имеющий ст рукт уры ,
все методы которого являются
абст ракт ны ми.
• Договор на реализацию некоторых
методов.
• Способ описать, какими должны быть
ваши классы.
Интерфейс
type
IPrintable = interface
procedure Preview(xsize,ysize:integer);
procedure Print(printer : IPrinter);
end;
Для печати нужен какой-либо принтер,
он также передается в виде интерфейса
Интерфейс
Необходимо наследовать,
чтобы реализовать интерфейс
Наследуем самому
интерфейсу
type
TMyDoc = class(TInterfacedObject, IPrintable)
private
function CheckFields : boolean;
public
procedure Fill(Parameters : TDocParams);
procedure Preview;
procedure Print(printer : IPrinter);
end;
Объявление и
реализация
необходимы!
Что это дает?
• Возможность выделить поведение,
характерное для каких-либо групп
объектов
• Возможность регламентировать
поведение
• Определение общих алгоритмов на основе
интерфейсов
• Создание кода, работающего с классами,
которые еще только будут созданы
Интерфейс
Получается, что интерфейс является, по
сути, абстрактным классом. Зачем же
выделять отдельное понятие?
Множественное наследование
интерфейсов
IEditable
IPrintable
Cut
Copy
Delete
Preview
Print
TMyDoc
FParams:TList
Preview
Print
Cut
Copy
Delete
Множественное наследование
интерфейсов. Проблема
IPrintable
IEditable
Preview
Print
Copy
Cut
Copy
Delete
TMyDoc
FParams:TList
Preview
Print
Cut
Copy
Delete
Решение 1: Запрет на реализацию
интерфейсов с одинаковыми
сигнатурами методов
IPrintable
IEditable
Preview
Print
Copy
Cut
Copy
Delete
TMyDoc
FParams:TList
Preview
Print
Cut
Copy
Delete
Решение 2: Явное разрешение
неоднозначности
IPrintable
IEditable
Preview
Print
Copy
Cut
Copy
Delete
TMyDoc
FParams:TList
Preview
Print
Cut
IPrintable.Copy
IEditable.Copy
Delete
Решение 3: Общая реализация
одноименных методов
IPrintable
Preview
Print
Copy
IEditable
Cut
Copy
Delete
IPrintAndEditab
le
TMyDoc
FParams:TList
Preview
Print
Cut
Copy
Delete
Preview
Print
Cut
Copy
Delete
Контрольные вопросы
• Что такое абстрактный класс?
• Зачем нужны абстрактные классы?
• Является ли интерфейс абстрактным
классом?
• Как решается проблема
множественного наследования для
интерфейсов?