Принципы ООП
2.79M
Category: programmingprogramming

3.3

1. Принципы ООП

Рожков Константин Олегович
Инженер-программист в «Диасофт»

2.

Ключевые принципы ООП
Классы и объекты
Инкапсуляция
Наследование
Полиморфизм
Абстракция
Интерфейсы
2

3.

Ключевые принципы ООП
Классы и объекты
Инкапсуляция
Наследование
Полиморфизм
Абстракция
Интерфейсы
3

4.

Абстракция
Абстракция: Абстракция позволяет скрыть
сосредоточиться на ключевых аспектах объекта.
реализацию
деталей
и
В Java абстракция может быть достигнута через абстрактные классы и
интерфейсы.
На практике из прошлого занятия мы создавали классы—потомки счетов от
родительского класса Account. При написании кода мы подразумевали, что
наши потомки будут иметь атрибуты и методы класса Account, однако
экземпляра класса Account не будет.
Именно для этого и существуют абстрактные классы.
4

5.

Абстракция
Сделаем класс Account абстрактным. Теперь в коде будет невозможно
допустить ошибку и создать экземпляр класса Account.
Так же мы создали 2 абстрактных метода add и pay. Абстрактные методы не
требую реализации, но наследники этого класса будут обязаны эти методы
переопределять, чтобы указать реализацию.
5

6.

Абстракция
Абстрактный класс содержит поля и методы
От абстрактного класса нельзя создать экземпляр
Может содержать методы без реализации (абстрактные)
Абстрактный класс решает сразу несколько проблем
1.
не может быть создан, значит не будет объектов с нереализованными
методами
2.
нет необходимости бросать исключения
3.
обязывает потомков переопределить методы
4.
гарантирует наличие переопределенного метода в классе-потомке
Важно запомнить, что обычный класс не может иметь абстрактных методов.
Это значит, что любой класс, который наследует абстрактный класс с
абстрактными методами, обязан их реализовать внутри себя. Или тоже стать
абстрактным.
6

7.

Преимущества абстрактных классов
Общая функциональность: Абстрактные классы могут содержать как
абстрактные методы, так и конкретные методы. Это позволяет определить
общую функциональность для всех подклассов.
Наследование: Подклассы могут наследовать абстрактные классы, что
позволяет им использовать и расширять функциональность, определенную
в абстрактном классе. Это способствует повторному использованию кода.
Полиморфизм: Абстрактные классы могут использоваться для реализации
полиморфизма. Объекты подклассов могут быть обработаны как объекты
абстрактного класса, что облегчает взаимодействие и обработку объектов
различных типов.
Шаблонный метод: Абстрактные классы могут содержать методы с пустым
телом (абстрактные методы), которые должны быть реализованы в
подклассах. Это позволяет определить общую структуру алгоритмов,
оставляя детали реализации на уровне подклассов.
7

8.

Недостатки абстрактных классов
Ограничение наследования: В Java класс может наследовать только один
абстрактный класс, что ограничивает гибкость по сравнению с
интерфейсами.
Сложность иерархии: Использование абстрактных классов может
привести к сложным иерархиям классов, особенно если существует
несколько уровней абстракции. Это может затруднить понимание и
поддержку кода.
Тесная связь: Подклассы абстрактного класса тесно связаны с
родительским классом, что может затруднить переиспользование кода в
других контекстах.
Недоступность для простых классов: Простые классы, не требующие
общей реализации, могут не нуждаться в использовании абстрактных
классов. Использование ими абстрактных классов может привести к
избыточности и усложнению кода.
8

9.

Ключевые принципы ООП
Классы и объекты
Инкапсуляция
Наследование
Полиморфизм
Абстракция
Интерфейсы
9

10.

Интерфейсы
Интерфейсы: Интерфейсы в Java позволяют определить методы, которые класс
должен реализовать. Они предоставляют способ для реализации
множественного наследования и улучшают гибкость программы.
10

11.

Интерфейсы
Как мы помним, в Java нет множественного наследования. Нельзя одному
классу сразу наследоваться он нескольких других классов.
Но может сложиться ситуация, когда есть какая-то группа классов, что имеют
общую функциональность, но общих полей и кода они не имеют. Как нам можно
группировать их?
Для таких ситуаций используются интерфейсы.
11

12.

Интерфейсы
Представим, что мы строим зоопарк и нам нужно разместить в нем животных
по возможностям.
Возьмем для примера летающих обитателей нашего зоопарка.
Если животное летает, оно должно иметь просторную клетку с жердочками.
Например, попугай или летучая мышь.
Технически они оба являются животными и могли бы наследовать общего
абстрактного родителя «Животное», но нас в данной ситуации это не
интересует.
Нас интересует, что они летают. Следовательно, мы должны иметь возможности
группировать их по этому признаку.
Нам совершенно не интересно, каким образом они летают.
12

13.

Интерфейсы
Мы можем унаследовать их от абстрактного класса «Летающие животное» и это
будет работать, но так как у животных в целом много отличий (рацион питания,
образ жизни), а множественное наследование в Java запрещено и мы не можем
помимо летающего животного унаследовать еще и «Хищное животное» в случае
с летучей мышью или «Травоядное» в случае с попугаем, то нам как раз на
помощь приходят интерфейсы.
Пишем интерфейс «летающие».
13

14.

Интерфейсы
С интерфейсом наш класс мы связываем через ключевое слово implements
(реализует). Множественная реализация интерфейсов в Java разрешена.
14

15.

Интерфейсы
В классе Main создаем экземпляры летучей мыши и попугая, помещаем их в
массив (клетку) и потом через цикл for реализуем у каждого объекта метод
fly()
15

16.

Преимущества интерфейсов
Абстракция:
Интерфейсы позволяют создавать абстрактные типы данных, определяя
только методы, которые должны быть реализованы классами, но не их
реализацию. Это способствует более чистой и гибкой архитектуре
программы.
Разделение интерфейса и реализации:
Использование интерфейсов позволяет разделить определение методов
(интерфейс) от их реализации в конкретных классах. Это упрощает
поддержку и расширение кода.
Множественное наследование:
В отличие от классов, которые могут наследоваться только от одного
класса, классы могут реализовывать несколько интерфейсов. Это
обеспечивает гибкость при проектировании и позволяет классам иметь
функциональность нескольких источников.
Поддержка полиморфизма: Интерфейсы позволяют использовать
полиморфизм, позволяя объектам разных классов быть обработанными как
объекты одного интерфейса. Это упрощает взаимодействие между
различными частями программы.
16

17.

Недостатки интерфейсов
Дополнительная сложность: Использование интерфейсов может добавить
дополнительную сложность к программе, особенно если требуется
реализовать множество методов из интерфейса в различных классах.
Необходимость реализации методов: Классы, реализующие интерфейс,
должны обязательно предоставить реализацию всех методов, объявленных
в интерфейсе. Это может быть ограничивающим фактором, особенно если
нужно реализовать множество интерфейсов.
Изменение интерфейса: Изменение интерфейса (добавление новых
методов, изменение существующих) может повлечь за собой необходимость
изменения всех классов, реализующих этот интерфейс. Это может привести
к дополнительной работе при обновлении интерфейса.
Избыточность: В некоторых случаях использование интерфейсов может
показаться избыточным, особенно для простых программ или небольших
проектов, где не требуется высокая степень абстракции и гибкости.
17

18.

Абстрактный класс и интерфейс
Абстрактные классы:
• могут хранить состояние (поля) и описывать поведение (методы)
• описывают сходные по свойствам классы
• наследовать несколько абстрактных классов нельзя
Интерфейсы:
описывают только поведение (методы)
переменные в интерфейсах являются неизменяемыми константами
могут быть реализованы на абсолютно разных классах
класс может реализовывать несколько интерфейсов
18

19.

Интерфейс
ContactlessPayment
Абстрактный класс BankCard
(Имя владельца
Номер, сvv-код, метод для
оплаты)
Класс
VisaCard
Интерфейс
OnlinePayment
Класс
MasterCard
Класс
ContactlessOnline
PaymentCard
19

20.

20

21.

21

22.

22

23.

Тип данных Enum
Enum в Java - это тип данных, который содержит фиксированный набор
констант. Enum классы помогают создавать более читаемый и безопасный
код, так как они ограничивают возможные значения переменных.
Чтобы создать enum класс достаточно написать enum и название класса, а
так же перечислить набор констант, которые будут входить в этот класс.
23

24.

Тип данных Enum
Создадим экземпляр класса:
Вывод в консоль:
24

25.

Метод values()
values(): Возвращает массив всех констант Enum класса.
Вывод в консоль:
25

26.

Метод valueOf(String name)
valueOf(String name): Возвращает константу enum класса по ее имени.
Вывод в консоль:
26

27.

Особенности Enum Классов
Ограниченное количество экземпляров: Enum классы могут иметь только
определенное количество экземпляров, определенных в самом классе.
Безопасность типов: Переменные, объявленные с типом enum, могут
принимать только значения, определенные в enum классе.
Имеют методы и поля: Enum классы могут иметь конструкторы, методы и
поля, что позволяет им быть более гибкими.
27

28.

Обертки над примитивами
В Java существуют обертки (wrapper classes) для примитивных типов
данных, такие как Integer, Double, Boolean, и другие. Вот некоторая
информация о обертках примитивов:
Такие классы нужны для расширения функционала примитивных типов,
например, для преобразования строки в число
Integer.parseInt("1901");
28

29.

Примеры использования
29

30.

Обертки над примитивами
Преимущества:
• Могут быть использованы вместе с коллекциями и Generics.
• Позволяют использовать null для представления отсутствия значения.
• Предоставляют дополнительные методы для работы с данными.
Недостатки:
• Требуют больше памяти, чем примитивные типы.
• Могут приводить к ошибкам из-за null значений.
• Могут замедлить выполнение программы из-за упаковки и распаковки
значений.
30

31.

Практика
Работа с обертками над примитивами
Создайте метод sumIntegers с сигнатурой public static Integer
sumIntegers(Integer a,
Integer
b), который принимает два
целочисленных значения типа Integer и возвращает их сумму.
Создайте метод multiplyDoubles с сигнатурой public static Double
multiplyDoubles(Double a, Double b), который принимает два числа с
плавающей точкой типа Double и возвращает их произведение.
Создайте метод convertToBinaryString с сигнатурой public static String
convertToBinaryString(Integer
number),
который
принимает
целочисленное значение типа Integer и возвращает его двоичное
представление в виде строки. (Integer.toBinaryString)
Инициализируйте
переменные
обертки
над
примитивами
(например, Integer, Double) и вызовите созданные методы для
выполнения операций.
Выведите результаты операций на экран.
31

32.

Практика
Реализовать программу управления заказами в
использованием Enum класса для статусов заказа.
интернет-магазине
с
Порядок действий:
1. Создание
класса
Order
с
полями
orderId,
orderStatus
и
методами setStatus и getStatus.
2. Создание метода updateStatus, который принимает текущий статус заказа
и новый статус и обновляет статус заказа, учитывая возможные переходы
между
статусами
(из
NEW
в
PROCESSING,
из PROCESSING в COMPLETED и т.д.).
3. Инициализация нескольких заказов и их статусов.
4. Вывод на экран информации о заказах и их текущих статусах.
5. Вызов метода updateStatus для изменения статуса одного из заказов.
6. Повторный вывод на экран информации о заказах, чтобы убедиться, что
статус заказа был успешно обновлен.
32

33.

Практика
Создайте абстрактный класс Shape, который содержит абстрактный
метод
calculateArea().
Реализуйте
этот
класс
двумя
дочерними
классами: Circle и Rectangle. У каждого из дочерних классов реализуйте
метод calculateArea() для вычисления площади окружности и прямоугольника
соответственно.
33

34.

Практика
Определите интерфейс Clickable, содержащий метод onClick(), который
выводит сообщение о нажатии. Создайте класс Button, который реализует
интерфейс
Clickable
и
имеет
свойство
label.
При
вызове
метода onClick() кнопка должна выводить сообщение с текстом кнопки.
34

35.

Практика
Создайте класс Vehicle, который содержит метод start(). Определите
интерфейсы Flyable (с методом fly()) и Drivable (с методом drive()). Создайте
класс Car, который наследует от класса Vehicle и реализует
интерфейс Drivable, а также класс Airplane, который наследует от
класса Vehicle и реализует интерфейс Flyable. Проверьте работу
методов start(), drive() и fly().
35

36.

Практика
Реализуйте класс Employee с полями name, salary и методом calculateBonus().
Создайте интерфейс Payable, содержащий метод calculatePay(). Создайте
класс
Manager,
который
наследует
от
Employee
и
реализует
интерфейс Payable. Метод calculatePay() в классе Manager должен учитывать
и базовую зарплату, и премию в зависимости от производительности.
36

37.

Итоги
Сегодня мы узнали что такое интерфейс и абстрактный класс
Посмотрели примеры их использования
Узнали, когда лучше использовать интерфейс, а когда абстрактный класс
Рассмотрели класс Enum и обертки над примитивами и для чего они могут
понадобиться
37
English     Русский Rules