Similar presentations:
Объектно-ориентированное программирование
1. Объектно-ориентированное программирование
Объектноориентированноепрограммирование
§ 46. Что такое ООП?
§ 47. Объекты и классы
§ 48. Создание объектов в программе
§ 49. Скрытие внутреннего устройства
§ 50. Иерархия классов
§ 51. Программы с графическим интерфейсом
§ 52. Программирование в RAD-средах
§ 53. Использование компонентов
§ 54. Совершенствование компонентов
§ 55. Модель и представление
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru
1
2. Объектно-ориентированное программирование
2Объектноориентированное
программирование
§ 46. Что такое ООП?
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru
3. Зачем нужно что-то новое?
3Объектно-ориентированное программирование, 11 класс
Зачем нужно что-то новое?
!
Главная проблема – сложность!
•программы из миллионов строк
•тысячи переменных и массивов
Э. Дейкстра: «Человечество еще в древности
придумало способ управления сложными системами:
«разделяй и властвуй»».
Структурное программирование:
декомпозиция
задача
по задачам
подзадача 1
подзадача 2.1
подзадача 2
подзадача 2.2
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
подзадача 3
подзадача 2.3
человек мыслит
иначе,
объектами
http://kpolyakov.spb.ru
4. Как мы воспринимаем объекты?
4Объектно-ориентированное программирование, 11 класс
Как мы воспринимаем объекты?
существенные
свойства
Абстракция – это выделение существенных свойств
объекта, отличающих его от других объектов.
!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
Разные цели –
разные модели!
http://kpolyakov.spb.ru
5. Использование объектов
5Объектно-ориентированное программирование, 11 класс
Использование объектов
Программа – множество объектов (моделей), каждый из
которых обладает своими свойствами и поведением,
но его внутреннее устройство скрыто от других
объектов.
!
Нужно «разделить» задачу на объекты!
А
В
Б
Б1
Б1
В1
Б2
Б2
В2
В2
В3
В3
Б3
Б3
Г
Г1
Г1
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
Г2
декомпозиция
по объектам
http://kpolyakov.spb.ru
6. Объектно-ориентированное программирование
6Объектноориентированное
программирование
§ 47. Объекты и классы
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru
7. С чего начать?
7Объектно-ориентированное программирование, 11 класс
С чего начать?
Объектно-ориентированный анализ (ООА):
• выделить объекты
• определить их существенные свойства
• описать поведение (команды, которые они
могут выполнять)
Что такое объект?
?
Объектом можно назвать то, что имеет чёткие границы
и обладает состоянием и поведением.
Состояние определяет поведение:
• лежачий человек не прыгнет
• незаряженное ружье не выстрелит
Класс – это множество объектов, имеющих общую
структуру и общее поведение.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
8. Модель дороги с автомобилями
8Объектно-ориентированное программирование, 11 класс
Модель дороги с автомобилями
Объект «Дорога»:
ширина
(число полос)
длина
свойства
(состояние)
Дорога
длина
ширина
название
класса
методы
(поведение
)
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
9. Модель дороги с автомобилями
9Объектно-ориентированное программирование, 11 класс
Модель дороги с автомобилями
Объект «Машина»:
свойства: координаты и скорость
P
V
X
• все машины одинаковы
• скорость постоянна
• на каждой полосе – одна машина
• если машина выходит за правую
границу дороги, вместо нее слева
появляется новая машина
Машина
X (координата)
P (полоса)
V (скорость)
двигаться
Метод – это процедура или функция, принадлежащая
классу объектов.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
10. Модель дороги с автомобилями
10Объектно-ориентированное программирование, 11 класс
Модель дороги с автомобилями
Взаимодействие объектов:
Дорога
длина
ширина
узнать длину
Машина
X (координата)
P (полоса)
V (скорость)
двигаться
Схема определяет
• свойства объектов
• методы: операции, которые они могут выполнять
• связи (обмен данными) между объектами
!
Ни слова о внутреннем устройстве объектов!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
11. Объектно-ориентированное программирование
11Объектноориентированное
программирование
§ 48. Создание объектов в
программе
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru
12. Классы
12Объектно-ориентированное программирование, 11 класс
Классы
• программа – множество взаимодействующих объектов
• любой объект – экземпляр какого-то класса
• класс – описание группы объектов с общей структурой и
поведением
отличие от
Класс
структур!
Данные
Методы
состояние
поведение
Поле – это переменная, принадлежащая объекту.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
13. Класс «Дорога» (FreePascal)
13Объектно-ориентированное программирование, 11 класс
Класс «Дорога» (FreePascal)
Объявление класса:
type
TRoad = class
Length: real;
Width: integer
end;
Объявление переменной:
var road: TRoad;
!
Память не выделяется!
!
Это только указатель!
Создание объекта в памяти:
road:= TRoad.Create;
вызов
конструктор
а
Конструктор – это метод класса, который
вызывается для создания объекта этого класса.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
14. Класс «Дорога» (FreePascal)
14Объектно-ориентированное программирование, 11 класс
Класс «Дорога» (FreePascal)
Простая программа:
режим работы с
{$mode objfpc}
объектами
type
TRoad = class
Length: real;
Width: integer;
end;
var road: TRoad;
begin
road:= TRoad.Create;
road.Length:=
road.Length:= 60;
60;
изменение
road.Width:= 3
данных (полей)
end.
road.Width:= 3
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
15. Новый конструктор
15Объектно-ориентированное программирование, 11 класс
Новый конструктор
type
TRoad = class
Length: real;
параметр
ы
Width: integer;
constructor
constructor Create(length0:
Create(length0: real;
real;
width0: integer)
end;
width0: integer)
Использование:
road:= TRoad.Create(60, 3);
длина
(length0)
?
ширина
(width0)
Что будет делать конструктор?
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
16. Новый конструктор
16Объектно-ориентированное программирование, 11 класс
Новый конструктор
constructor TRoad.Create(length0: real;
width0: integer);
begin
защита от
if length0 > 0 then
неверных
Length:= length0
данных
else Length:= 1;
if width0 > 0 then
Width:= width0
else Width:= 1
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
17. Класс «Машина»
17Объектно-ориентированное программирование, 11 класс
Класс «Машина»
координата,
type
скорость
TCar = class
полоса
X, V: real;
P: integer;
дорога, по
road: TRoad;
которой едет
procedure move;
constructor Create(road0: TRoad;
p0: integer; v0: real)
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
18. Конструктор класса «Машина»
18Объектно-ориентированное программирование, 11 класс
Конструктор класса «Машина»
constructor TCar.Create(road0: TRoad;
p0: integer; v0: real);
begin
road:= road0;
защита от ошибок –
P:= p0;
самостоятельно
V:= v0
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
19. Класс «Машина»: метод move
19Объектно-ориентированное программирование, 11 класс
Класс «Машина»: метод move
Равномерное движение:
X X 0 V t
t 1 интервал
перемещение за
одну единицу
времени
procedure
TCar.move;
begin
X:= X + V;
дискретизаци
и
выезжает с
другой стороны
if X > road.Length then X:= 0
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
20. Основная программа
20Объектно-ориентированное программирование, 11 класс
Основная программа
{ описание классов }
var road: TRoad;
Что выведет?
car: TCar;
10
i: integer;
10
begin
20
road := TRoad.Create( 65, 1 );
30
сar := TCar.Create( road, 1, 10 );
40
car.move;
50
writeln( 'После 1 шага:' );
60
writeln( car.X );
0
for i:=1 to 10 do begin
10
car.move;
дошли до
20
writeln( car.X );
конца дороги 30
end;
40
end.
?
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
21. Много машин
21Объектно-ориентированное программирование, 11 класс
Много машин
const N = 3;
var road: TRoad;
cars: array [1..N] of TCar;
i: integer;
begin
road:= TRoad.Create(60, N);
for i:=1 to N do
cars[i]:= TCar.Create(road, i, 2.0*i);
for i:=1 to N do
cars[i].move;
end.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
22. Что в этом хорошего и плохого?
22Объектно-ориентированное программирование, 11 класс
Что в этом хорошего и плохого?
ООП – это метод разработки больших программ!
основная программа – простая и понятная
классы могут разрабатывать разные
программисты независимо друг от друга
(+интерфейс!)
повторное использование классов
неэффективно для небольших задач
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
23. Задание
23Объектно-ориентированное программирование, 11 класс
Задание
«A»: Построить класс Попугай (TParrot), который умеет
говорить какую-то фразу, заранее определённую при
описании класса.
Пример:
p := TParrot.Create;
p.Say;
Привет, друзья!
«B»: Изменить класс из задания A так, чтобы фраза
задавалась при создании конкретного экземпляра.
Пример:
p1 := TParrot.Create( "Гав!" )
p2 := TParrot.Create( "Мяу!" )
p1.Say;
Гав!
p2.Say;
Мяу!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
24. Задание
24Объектно-ориентированное программирование, 11 класс
Задание
«С»: Изменить класс из задания B так, чтобы фразу можно
было изменять во время работы программы.
Пример:
p := TParrot.Create( "Гав!" );
p.Say;
Гав!
p.NewText( "Мяу!" );
p.Say;
Мяу!
«D»: Изменить класс из задания C так, чтобы при вызове
метода say можно было задать число повторений.
Пример:
p := TParrot.Create( "Гав!" );
p.Say( 1 );
Гав!
p.NewText( "Мяу!" );
p.Say( 3 );
Мяу! Мяу! Мяу!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
25. Задание
25Объектно-ориентированное программирование, 11 класс
Задание
«E»: Изменить класс из задания D так, чтобы можно было
добавлять фразы в набор фраз, которые знает попугай.
При вызове метода say попугай выдаёт случайную
фразу из своего набора.
Пример:
p := TParrot.Create( "Гав!" );
p.Say( 1 );
Гав!
p.learn( "Мяу!" )
p.Say( 1 );
Гав!
p.Say( 3 );
Мяу! Мяу! Мяу!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
26. Объектно-ориентированное программирование
26Объектноориентированное
программирование
§ 49. Скрытие внутреннего
устройства
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru
27. Зачем скрывать внутреннее устройство?
27Объектно-ориентированное программирование, 11 класс
Зачем скрывать внутреннее устройство?
Объектная модель задачи:
интерфейсы
?
?
защита внутренних данных
проверка входных данных на корректность
изменение устройства с сохранением интерфейса
Инкапсуляция («помещение в капсулу») – скрытие
внутреннего устройства объектов.
!
Также объединение данных и методов в
одном объекте!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
28. Защита внутренних данных
28Объектно-ориентированное программирование, 11 класс
Защита внутренних данных
состояние
методы
!
Cat
энергия
настроение
голод
есть
спать
играть
Меняем состояние
только через методы!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
?
Можно изменять
вучную?
метод есть
+ энергия
+ настроение
- голод
метод спать
+ энергия
+ голод
метод играть
- энергия
+ настроение
+ голод
http://kpolyakov.spb.ru
29. Пример: класс «перо»
29Объектно-ориентированное программирование, 11 класс
Пример: класс «перо»
type
TPen = class
color: string
end;
!
R
G
B
{ цвет, 'FF00FF'}
По умолчанию все члены класса открытые
(общедоступные) – public!
type
TPen = class
private
{ частные (закрытые) }
FColor: string
end;
Как к ним обращаться?
Field – поле
?
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
30. Пример: класс «перо»
30Объектно-ориентированное программирование, 11 класс
Пример: класс «перо»
type
TPen = class
private
{ частные (закрытые) }
FColor: string;
public { общедоступные (открытые) }
function
function getColor:
getColor: string;
string;
procedure
procedure setColor(newColor:
setColor(newColor: string)
string)
end;
методы доступа к
Получить значение:
закрытому полю
член класса TPen
function TPen.getColor: string;
begin
Result:= FColor
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
31. Пример: класс «перо»
31Объектно-ориентированное программирование, 11 класс
Пример: класс «перо»
Записать значение:
procedure TPen.setColor(newColor: string);
begin
if Length(newColor) <> 6 then
FColor:= '000000'
если ошибка,
else FColor:= newColor
чёрный цвет
end;
!
Защита от неверных данных!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
32. Пример: класс «перо»
32Объектно-ориентированное программирование, 11 класс
Пример: класс «перо»
Использование:
var pen: TPen;
...
pen.setColor( 'FFFF00' );
writeln( 'цвет пера: ',
pen.getColor );
!
установить
цвет
прочитать
цвет
Не очень удобно!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
33. Свойство
33Объектно-ориентированное программирование, 11 класс
Свойство
Свойство – это способ доступа к внутреннему
состоянию объекта, имитирующий обращение к его
внутренней переменной.
type
скрытые
TPen = class
методы!
private
FColor: string;
function
function getColor:
getColor: string;
string;
procedure
procedure setColor(newColor:
setColor(newColor: string);
string);
метод чтения
public
property
property сolor: string read getColor
write setColor
свойство
end;
метод записи
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
34. Свойство: использование
34Объектно-ориентированное программирование, 11 класс
Свойство: использование
property сolor: string read getColor
write setColor;
вызов TPen.setColor
pen.сolor := 'FFFF00';
writeln( 'цвет пера: ', pen.color );
вызов TPen.getColor
!
Такое же обращение, как к полю!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
35. Свойство: прямой доступ к полю
35Объектно-ориентированное программирование, 11 класс
Свойство: прямой доступ к полю
function TPen.getColor: string;
begin
Result:= FColor
end;
type
TPen = class
private
FColor: string;
procedure setColor(newColor: string);
public
property сolor: string read
read FColor
FColor
write setColor
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
36. Изменение внутреннего устройства
36Объектно-ориентированное программирование, 11 класс
Изменение внутреннего устройства
Удобнее хранить цвет в виде числа:
type
изменилось внутреннее
TPen = class
устройство
private
FColor: integer ;
...
public
property
property сolor:
сolor: string
string read
read getColor
getColor
write setColor
end;
Интерфейс не изменился!
!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
37. Изменение внутреннего устройства
37Объектно-ориентированное программирование, 11 класс
Изменение внутреннего устройства
function TPen.getColor: string;
begin
6 знаков
Result:= IntToHex(FColor, 6)
end;
в шестнадцатеричную
систему
procedure TPen.setColor(newColor: string);
begin
if Length(newColor) <> 6 then
FColor:= 0 { если ошибка, то чёрный }
из строки в число
else
FColor:= StrToInt('$' + newColor)
end;
признак
шестнадцатеричной
системы
Данные – целое число, свойство – строка!
!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
38. Свойство «только для чтения»
38Объектно-ориентированное программирование, 11 класс
Свойство «только для чтения»
Скорость машины можно только читать:
type
TCar = class
private
Fv: real;
...
нет возможности записи
public
property v: real read Fv;
...
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
39. Скрытие внутреннего устройства
39Объектно-ориентированное программирование, 11 класс
Скрытие внутреннего устройства
Инкапсуляция («помещение в капсулу»)
свойства
внутреннее
устройство
(private)
методы
интерфейс
(public)
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
40. Задание
40Объектно-ориентированное программирование, 11 класс
Задание
«A»: Построить класс РядЛампочек (TLampRow), который
хранит состояние ряда из 8 лампочек в виде символьной
строки. Цифра 0 обозначает выключенную лампочку,
цифра 1 – включенную.
Методы getState и setState скрывают внутреннюю
переменную state, которая хранит состояние лампочек.
При записи нового значения проверяется, что длина
строки состояния равна 8, иначе записываются все нули.
Метод Show выводит на экран состояние лампочек,
обозначая выключенную лампочку как минус, а
включённую – как «*».
Пример:
lamps := TLampRow.Create;
lamps.Show;
-------lamps.setState( '10101010' );
writeln( lamps.getState );
10101010
lamps.Show;
*-*-*-* К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
41. Задание
41Объектно-ориентированное программирование, 11 класс
Задание
«B»: Дополните класс TLampRow из задания A так, чтобы
количество лампочек в цепочке можно было задавать в
конструкторе.
Пример:
lamps := TLampRow.Create( 6 );
lamps.Show;
-----lamps.setState( '101010' );
writeln( lamps.getState );
101010
lamps.Show;
*-*-*lamps.setState( '10101010' );
ошибка
writeln( lamps.getState );
000000
lamps.Show;
------
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
42. Задание
42Объектно-ориентированное программирование, 11 класс
Задание
«С»: Дополните TLampRow из задания B так, чтобы лампочки
могли гореть одним из двух цветов – красный цвет имеет
код 1 и обозначается при выводе как «*», а зелёный цвет
имеет код 2 и обозначается как «о».
Пример:
lamps := TLampRow.Create( 6 );
lamps.Show;
-----lamps.setState( "102102" );
writeln( lamps.setState );
102102
lamps.Show;
*-o*-o
lamps.setState( "10201010" );
ошибка
writeln( lamps.getState );
000000
lamps.Show;
------
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
43. Задание
43Объектно-ориентированное программирование, 11 класс
Задание
«D»: Дополните TLampRow из задания C так, чтобы код
состояния хранился как целое число. При этом
интерфейс (способ вызова методов getState и setState)
не должен измениться.
Пример:
lamps := TLampRow.Create( 6 );
lamps.Show;
-----lamps.setState( "102102" );
writeln( lamps.setState );
102102
lamps.Show;
*-o*-o*
lamps.setState( "10201010" );
ошибка
writeln( lamps.getState );
000000
lamps.Show;
------
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
44. Объектно-ориентированное программирование
44Объектноориентированное
программирование
§ 50. Иерархия классов
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru
45. Классификации
45Объектно-ориентированное программирование, 11 класс
Классификации
?
Что такое классификация?
Классификация – разделение изучаемых объектов на
группы (классы), объединенные общими признаками.
?
Зачем это нужно?
Фрукт
Яблоко
Груша
базовый класс
Банан
Апельсин
классынаследники
это фрукт,
у которого…
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
46. Что такое наследование?
46Объектно-ориентированное программирование, 11 класс
Что такое наследование?
класс Двудольные
семейство Бобовые
род Клевер
горный клевер
наследует свойства
(имеет все
свойства)
Класс Б является наследником класса А, если можно
сказать, что Б – это разновидность А.
яблоко – фрукт
яблоко – это фрукт
горный клевер – клевер
горный клевер – это
растение рода Клевер
машина – двигатель
машина содержит
двигатель (часть –
целое)
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
47. Иерархия логических элементов
47Объектно-ориентированное программирование, 11 класс
Иерархия логических элементов
Логический
Логический элемент
элемент
сс одним
одним входом
входом
сс двумя
двумя входами
входами
НЕ
НЕ
Объектно-ориентированное программирование –
это такой подход к программированию, при котором
программа представляет собой множество
взаимодействующих объектов, каждый из которых
является экземпляром определенного класса, а
классы образуют иерархию наследования.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
48. Базовый класс
48Объектно-ориентированное программирование, 11 класс
Базовый класс
ЛогЭлемент
In1 (вход 1)
In2 (вход 2)
Res (результат)
type
TLogElement = class
In1, In2: boolean;
Res: boolean;
procedure calc
calc
end;
вычислить
выход
Зачем хранить результат?
?
можно моделировать
элементы с памятью
(триггеры)
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
?
Что плохо?
http://kpolyakov.spb.ru
49. Базовый класс
49Объектно-ориентированное программирование, 11 класс
Базовый класс
type
TLogElement = class
private
FIn1,
FIn1, FIn2: boolean;
boolean;
FRes:
FRes: boolean;
procedure
procedure setIn1(newIn1:
setIn1(newIn1: boolean);
procedure
procedure setIn2(newIn2:
setIn2(newIn2: boolean);
procedure
procedure calc;
calc;
Почему здесь?
public
property
property In1: boolean read FIn1
write setIn1;
property
property In2: boolean read FIn2
write setIn2;
property
property Res: boolean read FRes
end;
?
только для
чтения
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
50. Установка входа
50Объектно-ориентированное программирование, 11 класс
Установка входа
procedure TLogElement.setIn1(newIn1:
boolean);
begin
Что ещё?
FIn1:= newIn1;
calc
пересчёт при
end;
изменении входа
?
?
Как написать процедуру calc?
procedure TLogElement.calc;
begin
end;
!
заглушка
Проблема: наследники должны менять calc!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
51. Что такое полиморфизм?
51Объектно-ориентированное программирование, 11 класс
Что такое полиморфизм?
греч.: πολυ — много, μορφη — форма
Полиморфизм – это возможность классов-наследников
по-разному реализовать метод, описанный для
класса-предка.
!
Проблема: открыть данные и методы для
наследников и закрыть для остальных!
type
TLogElement = class
protected
защищённые
элементы: доступны
procedure calc;
только наследникам
...
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
52. Базовый класс
52Объектно-ориентированное программирование, 11 класс
Базовый класс
type
TLogElement = class
private
FIn1,
FIn1, FIn2: boolean;
boolean;
procedure
procedure setIn1(newIn1:
setIn1(newIn1: boolean);
procedure
procedure setIn2(newIn2:
setIn2(newIn2: boolean);
наследники
protected
наследники будут
protected
изменять поле
FRes:
FRes: boolean;
procedure
procedure calc;
calc; virtual; abstract;
property
property In2: boolean read FIn2
write setIn2;
public
property
property In1: boolean read FIn1
write setIn1;
property
property Res: boolean read FRes
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
53. Базовый класс
53Объектно-ориентированное программирование, 11 класс
Базовый класс
type
TLogElement = class
...
...
наследники будут
protected
изменять поле
FRes:
FRes: boolean;
procedure
procedure calc;
calc; virtual; abstract;
property
property In2: boolean read FIn2
write setIn2;
...
...
для элементов с
end;
одним входом не
одним входом не
нужно!
virtual (виртуальный) – этот метод могут переопределять
классы-наследники
abstract (абстрактный) – этот метод базовый класс не будет
реализовывать (оставляет наследникам)
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
54. Абстрактный класс
54Объектно-ориентированное программирование, 11 класс
Абстрактный класс
• все логические элементы должны иметь метод calc
• метод calc невозможно написать, пока неизвестен тип
логического элемента
Абстрактный метод – это метод класса, который
объявляется, но не реализуется в классе.
Абстрактный класс – это класс, содержащий хотя бы
один абстрактный метод.
нет логического элемента «вообще», как не «фрукта
вообще», есть конкретные виды
!
Нельзя создать объект абстрактного класса!
TLogElement – абстрактный класс из-за метода calc
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
55. Элемент «НЕ»
55Объектно-ориентированное программирование, 11 класс
Элемент «НЕ»
наследник от
TLogElement
type
переопределяет
TNot = class(TLogElement)
метод базового класса
protected
procedure
procedure calc;
calc; override ;
end;
procedure TNot.calc;
begin
FRes:= not In1
end;
!
?
Почему не not FIn1?
Это уже не абстрактный класс!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
56. Элемент «НЕ»
Объектно-ориентированное программирование, 11 класс56
Элемент «НЕ»
Использование:
объявление указателя
var n: TNot;
создани
...
е
n:= TNot.Create;
установка входа
n.In1:= False;
writeln(n.Res);
вывод результата
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
57. Элементы с двумя входами
Объектно-ориентированное программирование, 11 класс57
Элементы с двумя входами
наследник от
TLogElement
type
TLog2In = class(TLogElement)
public
повысить
property In2
«видимость»
end;
свойства
?
Можно ли создать объект этого класса?
нельзя, он
абстрактный
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
58. Элементы с двумя входами
58Объектно-ориентированное программирование, 11 класс
Элементы с двумя входами
type
элемент «И»
TAnd = class(TLog2In)
protected
procedure calc; override;
end;
элемент «ИЛИ»
TOr = class(TLog2In)
protected
procedure calc; override;
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
59. Элементы с двумя входами
59Объектно-ориентированное программирование, 11 класс
Элементы с двумя входами
procedure TAnd.calc;
begin
FRes:= In1 and In2
end;
procedure TOr.calc;
begin
FRes:= In1 or In2
end;
элемент «И»
элемент «ИЛИ»
доступ к защищённому
полю (protected)
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
60. Вызов виртуального метода
60Объектно-ориентированное программирование, 11 класс
Вызов виртуального метода
В базовом классе:
procedure TLogElement.setIn1(newIn1:
boolean);
begin
FIn1 := newIn1;
calc
end;
Какой метод вызывается?
?
type
TLogElement = class
...
protected
procedure calc; virtual; abstract;
...
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
61. Виртуальный метод
61Объектно-ориентированное программирование, 11 класс
Виртуальный метод
Статическое связывание:
транслятор записывает в код адрес процедуры
Динамическое связывание:
адрес процедуры определяется во время
выполнения программы в зависимости от типа
объекта
Виртуальный метод – это метод базового класса,
который могут переопределить классы-наследники
так, что конкретный адрес вызываемого метода
определяется только при выполнении программы.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
62. Пример: элемент «И-НЕ»
62Объектно-ориентированное программирование, 11 класс
Пример: элемент «И-НЕ»
var
var elNot:
elNot: TNot;
TNot;
elAnd:
elAnd: TAnd;
TAnd;
A
&
A,
B:
boolean;
A, B: boolean;
B
begin
begin
elNot:=
elNot:= TNot.Create;
TNot.Create;
elAnd:=
elAnd:= TAnd.Create;
TAnd.Create;
writeln('|
writeln('| AA || BB || not(A&B)
not(A&B) ');
');
writeln('-------------------');
writeln('-------------------');
for
for A:=False
A:=False to
to True
True do
do begin
begin
elAnd.In1:=
elAnd.In1:= A;
A;
for
for B:=False
B:=False to
to True
True do
do begin
begin
elAnd.In2:=
elAnd.In2:= B;
B;
elNot.In1:=
elNot.In1:= elAnd.Res;
elAnd.Res;
writeln('|
writeln('| ',
', integer(A),
integer(A), '' || ',
', integer(B),
integer(B),
'' || ',
', integer(elNot.Res))
integer(elNot.Res))
end
end
end
end
end.
end.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
63. Модульность
63Объектно-ориентированное программирование, 11 класс
Модульность
program
program logic;
logic;
{$mode
{$mode objfpc}
objfpc}
uses
uses log_elem;
log_elem;
var
var elNot:
elNot: TNot;
TNot;
elAnd:
elAnd: TAnd;
TAnd;
...
...
begin
begin
elNot:=
elNot:= TNot.Create;
TNot.Create;
elAnd:=
elAnd:= TAnd.Create;
TAnd.Create;
...
...
end.
end.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
unit
unit log_elem;
log_elem;
{$mode
{$mode objfpc}
objfpc}
interface
interface
type
type
TLogElement
TLogElement == class
class
...
...
end;
end;
TNot
TNot == class(TLogElement)
class(TLogElement)
...
...
TLog2In
TLog2In == class(TLogElement)
class(TLogElement)
...
...
implementation
implementation
...
...
procedure
procedure TOr.calc;
TOr.calc;
begin
begin
FRes:=
FRes:= FIn1
FIn1 or
or FIn2;
FIn2;
end;
end;
end.
end.
http://kpolyakov.spb.ru
64. Сообщения между объектами
64Объектно-ориентированное программирование, 11 класс
Сообщения между объектами
!
Задача – автоматическая передача
сигналов по цепочке!
type
TLogElement = class
private
FNextEl: TLogElement;
следующий
FNextIn: integer;
элемент в
...
цепочке
public
procedure Link(nextElement: TLogElement;
nextIn: integer);
...
номер входа
end;
следующего
элемента
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
65. Сообщения между объектами
65Объектно-ориентированное программирование, 11 класс
Сообщения между объектами
Установка связи:
procedure TLogElement.Link(
nextElement: TLogElement;
nextIn: integer);
begin
FNextEl:= nextElement;
FNextIn:= nextIn
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
66. Сообщения между объектами
66Объектно-ориентированное программирование, 11 класс
Сообщения между объектами
После изменения выхода «дергаем» следующий
элемент:
procedure TLogElement.setIn1(
newIn1: boolean);
begin
если следующий
FIn1:= newIn1;
элемент
calc;
установлен…
if FNextEl <> nil then
case FNextIn of
1: FNextEl.In1:= res;
2: FNextEl.In2:= res
end
end;
передать результат
на нужный вход
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
67. Сообщения между объектами
Объектно-ориентированное программирование, 11 класс67
Сообщения между объектами
Изменения в основной программе:
elNot:= TNot.Create;
установит
elAnd:= TAnd.Create;
ь связь
elAnd.Link(elNot, 1);
...
for A:=False to True do begin
elAnd.In1:= A;
for B:=False to True do begin
elAnd.In2:= B;
elNot.In1:= elAnd.Res;
...
это уже не
нужно!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
68. Задание
68Объектно-ориентированное программирование, 11 класс
Задание
«A»: Постройте класс TPet (домашнее животное) с двумя
скрытыми полями: FName (имя) и FAge (возраст). Они
должны быть доступны для чтения через свойства name
и age и недоступны для записи. Метод gettingOlder
увеличивает возраст на 1 год. Класс TPet – абстрактный,
он имеет абстрактный метод Say.
Постройте два класса-наследника – TCat (кошка) и TDog
(собака).Они должны реализовать метод Say.
Описания классов должны быть в отдельном модуле
animals.pas.
Пример: см. следующий слайд.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
69. Задание
69Объектно-ориентированное программирование, 11 класс
Задание
«A»:
Пример:
uses Animals;
Шарик: 6 лет
var pets: array of TPet;
Мурка: Мяу!
p: TPet;
Шарик: Гав!
begin
SetLength(pets, 2);
pets[0] := new TCat('Мурзик', 3);
p := new TDog('Шарик', 5);
p.gettingOlder;
writeln(p.Name, ': ', p.Age, ' лет');
pets[1] := p;
for var i:=0 to pets.Count-1 do
pets[i].Say;
end.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
70. Задание
70Объектно-ориентированное программирование, 11 класс
Задание
«B»: Добавьте класс TMammal (млекопитающее) –
наследник класса TPet и предок для классов TCat и
TDog. Он должен иметь метод Run (бежать),
который выводит сообщение вида «Вася побежал».
Пример:
pets[0] := new TCat('Мурзик', 3);
pets[1] := new TDog('Шарик', 5);
for var i:=0 to pets.Count-1 do begin
pets[i].Say;
if pets[i] is TMammal then
TMammal(pets[i]).Run;
end;
Мурзик:
Мурзик: Мяу!
Мяу!
Мурзик
Мурзик побежал...
побежал...
Шарик:
Шарик: Гав!
Шарик
Шарик побежал...
побежал...
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
71. Задание
71Объектно-ориентированное программирование, 11 класс
Задание
«C»: Добавьте класс TReptilia (рептилии) – наследник класса
TPet и предок для новых классов TTurtle (черепаха) и
TSnake (змея). Он должен иметь метод Crawl (ползти),
который выводит сообщение вида «Вася пополз…».
Пример:
pets[0] := new TCat('Мурзик', 3);
pets[1] := new TTurtle('Зак', 32);
pets[2] := new TDog('Шарик', 5);
pets[3] := new TSnake('Чаки', 2);
for var i:=0 to pets.Count-1
do begin
pets[i].Say;
if pets[i] is TMammal then
TMammal(pets[i]).Run;
if pets[i] is TReptilia then
TReptilia(pets[i]).Crawl;
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
Мурзик:
Мурзик: Мяу!
Мяу!
Мурзик
Мурзик побежал...
побежал...
Зак:
Зак: ...
...
Зак
Зак пополз...
пополз...
Шарик:
Шарик: Гав!
Гав!
Шарик
Шарик побежал...
побежал...
Чаки:
Чаки: ш-ш-ш-ш...
ш-ш-ш-ш...
Чаки
Чаки пополз...
пополз...
http://kpolyakov.spb.ru
72. Задание
72Объектно-ориентированное программирование, 11 класс
Задание
«A»: Собрать полную программу и построить таблицу
истинности последовательного соединения элементов
«ИЛИ» и «НЕ».
Пример:
A | B | not(A+B)
------------------0 | 0 | 1
0 | 1 | 0
1 | 0 | 0
1 | 1 | 0
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
73. Задание
73Объектно-ориентированное программирование, 11 класс
Задание
«B»: Добавить в иерархию классов элементы «И-НЕ» (TNAnd)
и «ИЛИ-НЕ» (TNOr), которые представляют собой
последовательные соединения элементов «И» и «ИЛИ» с
элементом «НЕ». Построить их таблицы истинности.
Пример:
A | B | A nand B
------------------0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
A | B | A nor B
------------------0 | 0 | 1
0 | 1 | 0
1 | 0 | 0
1 | 1 | 0
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
74. Задание
74Объектно-ориентированное программирование, 11 класс
Задание
«C»: Добавить в иерархию классов элемент «исключающее
ИЛИ» (TXor) и «импликация» (TImp). Построить их
таблицы истинности.
Пример:
A | B | A xor B
------------------0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
A | B | A -> B
------------------0 | 0 | 1
0 | 1 | 1
1 | 0 | 0
1 | 1 | 1
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
75. Задание
75Объектно-ориентированное программирование, 11 класс
Задание
«D»: Добавить в иерархию классов элемент «триггер»
(TTrigger). Построить его таблицу истинности при
начальных значениях выхода Q, равных 0 и 1.
Пример:
При Q = 0:
A | B | Q
------------------0 | 0 | 0
0 | 1 | 0
1 | 0 | 1
1 | 1 | 1
При Q = 1:
A | B | Q
------------------0 | 0 | 1
0 | 1 | 0
1 | 0 | 1
1 | 1 | 1
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
76. Объектно-ориентированное программирование
76Объектноориентированное
программирование
§ 51. Программы с графическим
интерфейсом
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru
77. Интерфейс: объекты и сообщения
77Объектно-ориентированное программирование, 11 класс
Интерфейс: объекты и сообщения
поле
ввода
флажок
кнопка
переключател
ь
Все элементы окон – объекты, которые обмениваются
данными, посылая друг другу сообщения.
Сообщение – это блок данных определённой
структуры, который используется для обмена
информацией между объектами.
• адресат (кому) или широковещательное
• числовой код (тип) сообщения
• параметры (дополнительные данные)
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
78. Классические программы
78Объектно-ориентированное программирование, 11 класс
Классические программы
начало
основная программа
ввод данных
обработка данных
вывод результатов
конец
!
процедуры и функции
Порядок выполнения команд определяется
программистом, пользователь не может вмешаться!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
79. Программы, управляемые событиями
79Объектно-ориентированное программирование, 11 класс
Программы, управляемые событиями
Событие – это переход какого-либо объекта из одного
состояния в другое.
• нажатие на клавишу
• щелчок мышью
• перемещение окна
• поступление данных из сети
• запрос к веб-серверу
• завершение вычислений
•…
!
Программа начинает работать при
наступлении событий!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
80. Программы, управляемые событиями
80Объектно-ориентированное программирование, 11 класс
Программы, управляемые событиями
клавиатура, мышь, …
системная очередь сообщений
начало
ожидание сообщения
стоп?
конец
очередь
программы
основная
программа
обработка сообщения
программа
!
операционная
система
обработчики
сообщений
Программа управляется событиями!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
81. Что такое RAD-среда?
81Объектно-ориентированное программирование, 11 класс
Что такое RAD-среда?
RAD = Rapid Application Development — быстрая
разработка приложений
Форма – это шаблон,
Этапы разработки:
по которому строится
• создание формы
окно программы или
• минимальный код
диалога
добавляется автоматически
• расстановка элементов интерфейса с
помощью мыши и настройка их свойств
• создание обработчиков событий
• написание алгоритмов обработки данных
выполняются при
возникновении
событий
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
82. RAD-среды: Delphi
82Объектно-ориентированное программирование, 11 класс
RAD-среды: Delphi
Язык: Object Pascal, позднее Delphi:
1995: Borland, сейчас: Embarcadero Technologies
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
83. RAD-среды: MS Visual Studio
83Объектно-ориентированное программирование, 11 класс
RAD-среды: MS Visual Studio
Языки: Visual Basic, Visual C++, Visual C#, Visual F#
c 1995 по н.в.: Microsoft
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
84. RAD-среды: Lazarus
84Объектно-ориентированное программирование, 11 класс
RAD-среды: Lazarus
Языки: FreePascal, Delphi
свободное ПО:
lazarus.freepascal.org
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
85. Объектно-ориентированное программирование
85Объектноориентированное
программирование
§ 52. Программирование в
RAD-средах
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru
86. Lazarus (lazarus.freepascal.org)
Объектно-ориентированное программирование, 11 класс86
Lazarus (lazarus.freepascal.org)
Свободное ПО для Windows, Mac OS X, Linux
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
87. Проект Lazarus
87Объектно-ориентированное программирование, 11 класс
Проект Lazarus
Проект – это набор файлов, из которых компилятор
строит исполняемый файл программы.
• проект (.lpr, Lazarus Project) – основная программа
• настройки проекта (*.lpi, Lazarus Project Information)
• модули, из которых состоит программа (*.pas);
• формы (*.lfm, Lazarus Form) – описания внешнего
вида и свойств окон и их элементов.
my.lpr
my.lpi
form1.pas
form1.lfm
unit1.pas
form2.pas
form2.lfm
unit3.pas
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
unit2.pas
my.exe
http://kpolyakov.spb.ru
88. Простейший проект
88Объектно-ориентированное программирование, 11 класс
Простейший проект
Файл – Создать – Проект – Приложение
главное окно
!
F9 – запуск!
Редактор кода
программы
Инспектор
объектов
Форма
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
89. Главное окно
Объектно-ориентированное программирование, 11 класс89
Главное окно
кнопки
быстрого
вызова команд
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
палитра
компонентов –
готовых объектов
http://kpolyakov.spb.ru
90. Инспектор объектов
90Объектно-ориентированное программирование, 11 класс
Инспектор объектов
дерево
объектов
выбор
обработчиков
событий
свойства
выделенного
объекта
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
91. Модуль формы
91Объектно-ориентированное программирование, 11 класс
Модуль формы
unit
unit Unit1;
Unit1;
модули библиотеки
interface
interface
Lazarus
uses
uses
Classes,
Classes, SysUtils,
SysUtils, FileUtil,
FileUtil, Forms,
Forms, Controls,
Controls,
Graphics,
Graphics, Dialogs;
Dialogs;
type
type
класс формы
TForm1
TForm1 = class(TForm)
private
private
{ private declarations
declarations }}
public
public
{ public declarations
declarations }}
end;
end;
var
var
объявление
Form1:
формы
Form1: TForm1;
подключает
implementation
implementation
описание формы и
{$R
{$R *.lfm}
*.lfm}
компонентов
end.
end.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
92. Основная программа (проект)
92Объектно-ориентированное программирование, 11 класс
Основная программа (проект)
Ctrl+F12 – список модулей, выбрать *.lpr
program
program project1;
project1; модули библиотеки
uses
uses
Interfaces,
Interfaces, Forms,
Forms, Unit1;
Unit1; модуль формы
begin
begin
начальные установки
Application.Initialize;
Application.Initialize;
Application.CreateForm(TForm1,
Application.CreateForm(TForm1, Form1);
Form1);
Application.Run;
Application.Run;
создание
end.
end.
формы
запуск цикла
обработки
сообщений
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
93. Свойства формы
93Объектно-ориентированное программирование, 11 класс
Свойства формы
Left – левая граница (x-координата)
Top – верхняя граница (y-координата)
Width – ширина
MainForm
Height – высота
(TMainForm)
Name – имя формы
Caption – текст в заголовке окна
Color – цвет рабочей области
Font – шрифт надписей
Visible – видимость (да/нет)
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
94. Обработчик событий
94Объектно-ориентированное программирование, 11 класс
Обработчик событий
2 ЛКМ: создать
обработчик
OnCloseQuery: запрос
разрешения на закрытие
формы
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
95. Обработчик события
95Объектно-ориентированное программирование, 11 класс
Обработчик события
метод класса
TForm1
название
обработчика
общий
предок всех
объектов
procedure TForm1.FormCloseQuery(
кто послал
Sender: TObject;
сообщение
var CanClose: boolean);
begin
end;
!
результат
(можно/нельзя)
Автоматически добавлен в описание класса формы!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
96. Диалог с вопросом
96Объектно-ориентированное программирование, 11 класс
Диалог с вопросом
Функция MessageDlg:
procedure TForm1.FormCloseQuery(
Sender: TObject;
var CanClose: boolean);
var res: TModalResult;
тип: результат диалога
begin
res:= MessageDlg('Подтверждение',
'Вы
'Вы действительно
действительно хотите
хотите выйти
выйти из
из программы?',
программы?',
mtConfirmation, [mbYes,mbNo], 0);
CanClose := (res
(res == mrYes)
нет справки
end;
«да», если нажали Yes
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
97. Параметры MessageDlg
Объектно-ориентированное программирование, 11 класс97
Параметры MessageDlg
• заголовок окна
• сообщение пользователю
• тип запроса
mtError
ошибка
mtWarning
предупреждение
mtInformation информация
mtConfirmation подтверждение
• набор (множество) кнопок:
mbYes
«да»
mbNo
«нет»
mbOK
«OK»
mbCancel «Отмена»
• номер раздела справки
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
98. Объектно-ориентированное программирование
98Объектноориентированное
программирование
§ 53. Использование
компонентов
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru
99. Панель компонентов
99Объектно-ориентированное программирование, 11 класс
Панель компонентов
Стандартные
Диалоги
Дополнительны
е
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
Системные
Базы данных
http://kpolyakov.spb.ru
100. Просмотр рисунков
100Объектно-ориентированное программирование, 11 класс
Просмотр рисунков
кнопка
TButton
панель
TPanel
выключатель
TCheckBox
рисунок
TImage
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
101. Настройка формы
101Объектно-ориентированное программирование, 11 класс
Настройка формы
Файл – Создать – Проект – Приложение
Name MainForm
Caption Просмотр рисунков
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
102. Верхняя панель
102Объектно-ориентированное программирование, 11 класс
Верхняя панель
Align = alTop
панель
TPanel
Caption = ''
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
103. Кнопка и выключатель
103Объектно-ориентированное программирование, 11 класс
Кнопка и выключатель
кнопка
TButton
Name = OpenBtn
Caption = Открыть файл
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
выключатель
TCheckBox
Name = SizeCB
Caption = По размерам окна
http://kpolyakov.spb.ru
104. Инспектор объектов
104Объектно-ориентированное программирование, 11 класс
Инспектор объектов
«родитель» для Panel1
«родитель» для
…
Родительский объект:
• отвечает за перерисовку
дочерних объектов
• все дочерние объекты
перемещаются вместе с
ним
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
105. Компонент TImage
105Объектно-ориентированное программирование, 11 класс
Компонент TImage
рисунок
TImage
Name = Image
Align = alClient
?
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
1) Загрузка файла?
2) Масштабирование?
http://kpolyakov.spb.ru
106. Выбор файла
106Объектно-ориентированное программирование, 11 класс
Выбор файла
выбор рисунка
TOpenPictureDialo
g
Name = OpenDlg
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
107. Выбор файла
Объектно-ориентированное программирование, 11 класс107
Выбор файла
если файл выбран
загрузить файл
if OpenDlg.Execute then
имя файла
Image.Picture.LoadFromFile(
OpenDlg.FileName );
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
108. Масштабирование
Объектно-ориентированное программирование, 11 класс108
Масштабирование
Image.Proportional :=
SizeCb.Checked;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
109. Ввод и вывод данных
109Объектно-ориентированное программирование, 11 класс
Ввод и вывод данных
для веб-страниц
поле ввода
rEdit
TEdit
метка rgbLabel
TLabel
метки
TLabel
фигура rgbShape
TShape
поле ввода
bEdit
TEdit
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
поле ввода
gEdit
TEdit
http://kpolyakov.spb.ru
110. Обновление компонентов вывода
110Объектно-ориентированное программирование, 11 класс
Обновление компонентов вывода
выделить все три
(+Shift)
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
111. Обновление компонентов вывода
111Объектно-ориентированное программирование, 11 класс
Обновление компонентов вывода
procedure TForm1.rEditChange(
Sender: TObject);
var r, g, b: integer;
из строки в число
begin
r:= StrToInt(rEdit.Text);
g:= StrToInt(gEdit.Text);
построить цвет
b:= StrToInt(bEdit.Text);
rgbShape.Brush.Color:= RGBToColor(r,g,b);
rgbLabel.Caption:= '#' + IntToHex(r,2)
+ IntToHex(g,2) + IntToHex(b,2)
end;
в шестнадцатеричную
систему
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
112. Вызов при запуске
Объектно-ориентированное программирование, 11 класс112
Вызов при запуске
procedure TForm1.FormCreate(
Sender: TObject);
begin
вызов
обработчика
rEditChange(rEdit)
end;
вызывающий
объект – rEdit
(здесь
(здесь –– всё
всё равно!)
равно!)
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
113. Обработка ошибок
Объектно-ориентированное программирование, 11 класс113
Обработка ошибок
?
Если вместо числа ввести букву?
!
Программа не должна «вылетать»!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
114. Обработка ошибок
114Объектно-ориентированное программирование, 11 класс
Обработка ошибок
попытаться
выполнить
try
{ «опасные» команды }
except
если исключение
{ обработка ошибки } (аварийная ситуация)
end;
?
Какие у нас опасные операции?
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
115. Обработка ошибок
115Объектно-ориентированное программирование, 11 класс
Обработка ошибок
try
r:= StrToInt(rEdit.Text);
g:= StrToInt(gEdit.Text);
b:= StrToInt(bEdit.Text);
rgbShape.Brush.Color:= RGBToColor(r,g,b);
rgbLabel.Caption:= '#' + IntToHex(r,2)
+ IntToHex(g,2) + IntToHex(b,2)
except
rgbLabel.Caption:=
rgbLabel.Caption:= '?’
'?’
end;
если ошибка, записать
'?'
Что делать, если ошибка?
?
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
116. Блокирование неверных символов
116Объектно-ориентированное программирование, 11 класс
Блокирование неверных символов
выделить все три
(+Shift)
procedure TForm1.rEditKeyPress(
Sender: TObject; var Key: char);
Backspace
begin
if not (Key in ['0'..'9',#8]) then
Key:= #0
множество разрешённых
end;
символов
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
117. Задание
117Объектно-ориентированное программирование, 11 класс
Задание
«A»: Постройте программу, которая вычисляет площадь
комнаты.
Требования:
1) размер окна нельзя менять
2) при попытке закрыть окно выдаётся запрос на
подтверждение
3) площадь пересчитывается сразу же, как только
изменяются значения длины или ширины комнаты
4) если длина или ширина отрицательны или не числа,
вместо площади выводится знак вопроса
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
118. Задание
118Объектно-ориентированное программирование, 11 класс
Задание
«B»: Постройте программу, которая вычисляет площадь стен
комнаты и определяет, сколько рулонов обоев нужно на
оклейку всех стен. Количество рулонов – целое число.
Остальные требования такие же, как в варианта «А».
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
119. Задание
119Объектно-ориентированное программирование, 11 класс
Задание
«С»: Доработайте программу так, чтобы по щелчку по кнопке
«Сохранить» все данные сохранялись в файле с
расширением .dat (имя файла можно выбрать), а по
щелчку по кнопке «Загрузить» данные загружались из
файла (имя файла также выбирается).
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
120. Объектно-ориентированное программирование
120Объектноориентированное
программирование
§ 54. Совершенствование
компонентов
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru
121. Что требуется?
Объектно-ориентированное программирование, 11 класс121
Что требуется?
Задача: построить поле для ввода целых чисел, в котором
• есть защита от ввода неверных символов
• есть методы для чтения/записи целого числа
!
На основе класса TEdit!
type
TIntEdit = class(TEdit)
...
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
122. Поле для ввода целых чисел
122Объектно-ориентированное программирование, 11 класс
Поле для ввода целых чисел
• переопределить обработчик KeyPress (защита от
ввода неверных символов)
• свойство Value (значение)
методы GetValue (чтение) и SetValue (запись)
type
TIntEdit = class(TEdit)
private
function GetValue: integer;
procedure SetValue(Val: integer);
protected
procedure KeyPress(var Key: сhar);
override;
public
property Value: integer read GetValue
write SetValue
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
123. Поле для ввода целых чисел
123Объектно-ориентированное программирование, 11 класс
Поле для ввода целых чисел
Чтение целого числа:
function TIntEdit.GetValue: integer;
begin
try
Result:= StrToInt(Text);
except Result:= 0
из строки в
end
целое
end;
Запись целого числа:
procedure TIntEdit.SetValue(Val: integer);
begin
Text:= IntToStr(Val)
end;
из целого в
строку
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
124. Поле для ввода целых чисел
124Объектно-ориентированное программирование, 11 класс
Поле для ввода целых чисел
Нажатие на клавишу:
procedure TIntEdit.KeyPress(var Key:
сhar);
begin
if not (Key in ['0'..'9', #8]) then
Key:= #0;
inherited
inherited
end;
вызвать аналогичный
метод базового
класса
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
125. Поле для ввода целых чисел
125Объектно-ориентированное программирование, 11 класс
Поле для ввода целых чисел
Модуль (Файл – Создать модуль):
unit int_edit;
{$mode objfpc}
подключение TEdit
interface
uses
Classes, SysUtils, StdCtrls
StdCtrls ;
type
TIntEdit = class(TEdit)
...
end;
implementation
{ методы класса TIntEdit }
end.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
126. Поле для ввода целых чисел
126Объектно-ориентированное программирование, 11 класс
Поле для ввода целых чисел
Использование:
поле ввода decEdit
TIntEdit
метка hexLabel
TLabel
unit Unit1;
{$mode objfpc}
подключение модуля
interface
uses
Classes, ..., ExtCtrls, int_edit ;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
127. Поле для ввода целых чисел
127Объектно-ориентированное программирование, 11 класс
Поле для ввода целых чисел
!
Компонента TIntEdit нет в палитре!
Добавление вручную:
TForm1 = class(TForm)
...
decEdit: TIntEdit;
end;
это только указатель!
?
Когда создавать объект?
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
128. Поле для ввода целых чисел
128Объектно-ориентированное программирование, 11 класс
Поле для ввода целых чисел
Создание:
procedure TForm1.FormCreate(
Sender: TObject);
begin
создать объект
decEdit:= TIntEdit.Create(Self);
decEdit.Text:= '100';
decEdit.Left:= 6;
владелец –
decEdit.Top:= 6;
форма
decEdit.Width:= 115;
(удаляет)
decEdit.Parent:= Self
end;
«родитель» – форма
(перерисовывает)
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
129. Поле для ввода целых чисел
129Объектно-ориентированное программирование, 11 класс
Поле для ввода целых чисел
Обработчик сообщения:
TForm1 = class(TForm)
...
procedure decEditChange(
Sender: TObject);
public
добавить вручную
decEdit: TIntEdit;
end;
добавить вручную
procedure TForm1.decEditChange(
Sender: TObject);
begin
hexLabel.Caption:=
IntToHex(decEdit.Value,1)
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
130. Поле для ввода целых чисел
130Объектно-ориентированное программирование, 11 класс
Поле для ввода целых чисел
Подключение обработчика сообщения:
procedure TForm1.FormCreate(
Sender: TObject);
begin
decEdit:= TIntEdit.Create(Self);
decEdit.Text:= '100';
decEdit.Left:= 6;
decEdit.Top:= 6;
decEdit.Width:= 115;
адрес процедуры
decEdit.Parent:= Self;
@decEditChange;
decEdit.OnChange:=
decEdit.OnChange:= @decEditChange;
decEditChange(Sender);
end;
вызов при старте
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
131. Добавление компонента в палитру
131Объектно-ориентированное программирование, 11 класс
Добавление компонента в палитру
unit int_edit;
{$mode objfpc}
interface
…
implementation
процедура
…
регистрации
procedure Register;
begin
RegisterComponents('Samples', [TIntEdit]);
end;
end.
страница в
палитре
компонентов
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
названия
классов
(множество)
http://kpolyakov.spb.ru
132. Добавление компонента в палитру
132Объектно-ориентированное программирование, 11 класс
Добавление компонента в палитру
Порядок установки в среде Lazarus:
1. Пакет → Новый пакет → дать имя пакету и
сохранить
2. Добавить → Добавить файлы → Добавить файлы к
пакету → выбрать файл int_edit.pas
3. Добавить → Новая зависимость → LCLBase
4. Компилировать
5. Использовать → Установить
Согласиться на пересборку IDE.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
133. Объектно-ориентированное программирование
133Объектноориентированное
программирование
§ 55. Модель и представление
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru
134. Еще одна декомпозиция
134Объектно-ориентированное программирование, 11 класс
Еще одна декомпозиция
Задача: повторное использование написанного ранее
готового кода.
решение
модель
(данные и методы
их обработки)
представление
(интерфейс с
пользователем)
решение
представление
(интерфейс с
пользователем)
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
135. Модель и представление
135Объектно-ориентированное программирование, 11 класс
Модель и представление
Задача: хранить и использовать данные об изменении
курса доллара.
решение
модель
(массив,
(массив, поиск
поиск
минимума
минимума ии
максимума,
максимума,
прогнозирование)
прогнозирование)
представление
(формулы,
(формулы, диаграммы,
диаграммы,
графики,
графики, таблицы)
таблицы)
представление
x
1
2
3
y
1
2
3
z
4
5
6
модель
представление
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
136. Модель и представление
136Объектно-ориентированное программирование, 11 класс
Модель и представление
Задача: вычисление арифметического выражения:
• целые числа
• знаки арифметических действий + - * /
Модель:
• символьная строка
функция LastOp
• алгоритм вычисления:
(глава 6)
k:= номер последней операции
n1:= значение левой части
n2:= значение правой части
результат:= операция(n1, n2)
!
Рекурсия!
k
22 + 13 – 3 * 8
n1
n2
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
?
Чего не хватает?
http://kpolyakov.spb.ru
137. Модель
Объектно-ориентированное программирование, 11 класс137
Модель
Псевдокод:
k:= номер последней операции
если k = 0 то
результат:= строка в число
иначе
n1:= значение левой части
n2:= значение правой части
результат:= операция(n1, n2)
все
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
138. Модель
138Объектно-ориентированное программирование, 11 класс
Модель
function Calc ( s: string ): integer;
var k, n1, n2: integer;
begin
k:= LastOp ( s );
if k = 0 then Calc:= StrToInt(s)
else begin
n1:= Calc(Copy(s, 1, k-1));
n2:= Calc(Copy(s, k+1, Length(s)-k));
case s[k] of
'+': Calc:= n1+n2;
'-': Calc:= n1-n2;
'*': Calc:= n1*n2;
'/': Calc:= n1 div n2
end
end
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
139. Модель – в модуль
139Объектно-ориентированное программирование, 11 класс
Модель – в модуль
unit Model;
interface
function Calc(s: string): integer;
implementation
для функции
StrToInt
uses SysUtils;
function
...
function
...
function
...
end.
Priority(op: char): integer;
LastOpt(s: string): integer;
Calc(s: string): integer;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
140. Представление
140Объектно-ориентированное программирование, 11 класс
Представление
выпадающий
список
TComboBox
Name = Input
Align = alTop
многострочно
е поле TMemo
Name = Answers
Align = alClient
ReadOnly = True
если нажата клавиша Enter то
x:= значение выражения
добавить результат в конец поля вывода
если выражения нет в списке то
добавить его в список
все
все
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
141. Перехват нажатия на клавишу Enter
141Объектно-ориентированное программирование, 11 класс
Перехват нажатия на клавишу Enter
OnKeyPress для элемента Input:
procedure TForm1.InputKeyPress(
Sender: TObject; var Key: char);
begin
if
if Key
Key == #13
#13 then
then begin
begin
...
...
код клавиши
end
end
Enter
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
142. Обработка и вывод данных
142Объектно-ориентированное программирование, 11 класс
Обработка и вывод данных
Вычисления (обращение к модели):
uses Model;
Model;
...
x:= Calc(Input.Text);
Добавление строки в TMemo:
добавить
строку
Answers.Lines
Answers.Lines .Add(Input.Text + '='
+ IntToStr(x));
массив строк
в TMemo
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
число в строку
http://kpolyakov.spb.ru
143. Обработка и вывод данных
143Объектно-ориентированное программирование, 11 класс
Обработка и вывод данных
Добавление строки в TComboBox:
массив строк
в TComboBox
найти индекс
строки
i:= Input.Items
Input.Items .IndexOf(Input.Text);
.IndexOf(Input.Text);
if i < 0 then
then
Input.Items.Insert(0, Input.Text)
добавить
строку
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
позиция
списка
http://kpolyakov.spb.ru
144. Перехват нажатия на клавишу Enter
144Объектно-ориентированное программирование, 11 класс
Перехват нажатия на клавишу Enter
OnKeyPress для элемента Input:
procedure TForm1.InputKeyPress(
Sender: TObject; var Key: char);
var x, i: integer;
begin
if Key
Key = #13
#13 then begin
x:=
x:= Calc(Input.Text);
Answers.Lines.Add(Input.Text + '='
+ IntToStr(x));
i:=
i:= Input.Items.IndexOf(Input.Text);
if i < 0 then
then
Input.Items.Insert(0, Input.Text)
end
end
end;
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
145. Задание
145Объектно-ориентированное программирование, 11 класс
Задание
«A»: Измените программу так, чтобы она могла вычислять
значения выражений с вещественными числами.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
146. Задание
146Объектно-ориентированное программирование, 11 класс
Задание
«B»: Измените программу так, чтобы она могла вычислять
значения выражений со скобками.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
147. Задание
147Объектно-ориентированное программирование, 11 класс
Задание
«С»: Измените программу так, чтобы она могла вычислять
значения выражений, содержащих вызовы функций abs,
sin, cos, sqrt.
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
148. Задание
148Объектно-ориентированное программирование, 11 класс
Задание
«D»: Измените программу так, чтобы при вводе неверного
выражения выводилось сообщение об ошибке. :
Все результаты вычислений и сообщения об ошибках
записываются в файл results.txt. Процедуру записи
оформите как метод класса формы.
...
sin(1.2)*sqrt(1.7)=1.215230290196084
Неверное выражение sin(1.2)*sqrt(1.7)qwe
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
149. Калькулятор
Объектно-ориентированное программирование, 11 класс149
Калькулятор
!
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
Самостоятельно!
http://kpolyakov.spb.ru
150. Конец фильма
150Объектно-ориентированное программирование, 11 класс
Конец фильма
ПОЛЯКОВ Константин Юрьевич
д.т.н., учитель информатики
ГБОУ СОШ № 163, г. Санкт-Петербург
[email protected]
ЕРЕМИН Евгений Александрович
к.ф.-м.н., доцент кафедры мультимедийной
дидактики и ИТО ПГГПУ, г. Пермь
[email protected]
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru
151. Источники иллюстраций
Объектно-ориентированное программирование, 11 класс151
Источники иллюстраций
1.
2.
3.
4.
5.
6.
www.picstopin.com
maugav.info
yoursourceisopen.com
ru.wikipedia.org
иллюстрации художников издательства «Бином»
авторские материалы
К.Ю. Поляков, Е.А. Ерёмин, 2013-2019
http://kpolyakov.spb.ru