Вы находитесь на странице: 1из 10

Занятие 6. Наследование. Инкапсуляция. Полиморфизм.

Видео

Базовый принцип языка Java является объектно-ориентированное


программирование (ООП).

ООП состоит из базовых понятий.

- Класс

- Объект

- Метод

И основных концепций

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

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

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

Самый наглядный вариант объяснения чего-либо – это показать на уже


знакомоvм примере. Представьте детское ведерко. В плане ООП –

Это класс. То есть шаблон по которому будут создавать куличики. Куличики


– это объекты. Из куличиков. Мы можем построить дом, город, машины и
т.д. В программирование тоже самое – объекты служат для реализации
логики. Куличик может состоять из песка, глины, земли. Все эти состояния
описываются полями объекта. В классе Calculate – мы создавали поле int
result;

Куличик может разрушится – это действие описывается методом объекта. В


классе Calculate – это все методы add, div, multi.

С помощью этих элементов, можно добиться гибкий решений. Давайте


теперь рассмотрим основные концепции ООП.

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

Обратимся к Wiki
Наследование — механизм языка, позволяющий описать новый класс на
основе уже существующего (родительского, базового) класса или
интерфейса. Потомок может добавить собственные методы и свойства, а
также пользоваться родительскими методами и свойствами. Позволяет
строить иерархии.

Рассмотрим это на примере дома. Вначале мы построили одноэтажный дом.


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

Создадим класс Animal. Этот класс будет описывать всех животных.

В класс есть один метод, который возвращает имя животного.

Создам класс пес, на основании класса Animal.


Теперь в классе Dog доступен метод getName и появился новый метод
catchCat. Наследование в Java осуществляется с помощью ключевого слова
extends. Дословно – пес расширят животное. Такой подход позволяет
уменьшить количество кода, вторично использовать уже существующий код.

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

Инкапсуля́ция — размещение в оболочке, изоляция, закрытие чего-либо


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

Механизм инкапсуляции позволяет избавить код от лишнего шума. Скрыть


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

В Java механизм инкапсуляции достигается за счет модификаторов доступа.

- public – элемент доступен всем.

- protected – доступен только в пакете и наследникам.

- default – выставляется по умолчанию, доступен только внутри пакета.

- private – доступен только внутри класса.

Добавить в класс Dog внутренний метод – isHungry – который будет


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

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

Общее прототипическое значение — возможность существования чего-либо


в различных формах.

Наиболее наглядный пример – это кулинария. Из одних их тех же продуктов,


можно сделать разнообразные блюда. Тоже самое и в программирование. Мы
делаем определение, что данный метод принимает параметры А и возвращает
данные типа В. Мы задаем общее правило для работы этого метода. Теперь
мы можем создать много вариантов реализации этого правила. И все они
могут быть использованы на счет полиморфизма.

В Java полиморфизм может быть достигнуть за счет двух механизмов.

- Перекрытия методов в наследуемых классах.

В классе Dog переопределим метод getName из родительного класс Animal.


Реализуется это следующим образом. Создаем полностью идентичный метод
из родительного класса Animal. Перед методом добавляем аннотацию -
@Override – она говорит компилятору, что метод перекрыт из родительного
класса. Если метода не существует, или вы ошибетесь в синтаксисе,
компилятор сообщим вам об этом. Внутри метода реализуем свою логику. В
данном случае, я использовал вызов родительного метода через обращение
по ключевому слову super.

-
Использовании интерфейсов.
Интерфейсы в Java – это механизм описания, что должен содержать класс,
какие методы. Без описания, как эти методы должны работать. По сути это
соглашение, что класс должен делать.

Создается интерфейс аналогично обычному классу, только вместо ключевого


слова class нужно указать interface.

Теперь нам нужно указать что классы Animal должны работать по


интерфейсы Pet. Для этого нужно после имени класса указать ключевое
слово impelements и указать какие интерфейсы реализует данный класс.

В Java есть ключевая особенность языка – нет множественного наследования.


Задания

 Создать программу для обслуживания клиники домашних питомцев.


 Должна быть возможно добавлять клиентов.
 Указывать какой питомец есть у клиента.
 Возможность искать по кличке питомца, по имени клиента.
 Редактировать имя клиента, имя питомца.

Удалять клиента, питомца.

 Возможность валидации.
Решение

Вначале нарисуем общую схему взаимодействия элементов в программе.

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

1. Основной класс – Clinic – содержит методы управления клиникой. Как и в


реальной жизни клиника обеспечивает сохранение, добавление, удаление
информации по клиентам.

2. Client – класс описывает поведение клиента. Содержит информацию о


клиенте и его питомцах.

3. Validator – класс обертка для обеспечение корректного ввода от


пользователя. В качестве аргумента принимает Scanner.

4. Action – интерфейс, описывает действия программы.

5. ClinicUI – описывает пользовательский интерфейс.

Полный код всей программы клиника можно найти в папке java-way-from-


student-to-master/lessons_8
Особое внимание хотел уделить реализации поддерживаемых в программе
действий. Во всех решениях, что присылают подписчики общее решение для
такой задачи – это использование множественного условия, либо оператора
switch. Из-за такого подхода метод становится не читаемый и плохо
тестируемым.
Наиболее правильное решение – использование полиморфизма и карты
(коллекция Map). Так как в курсе еще не было темы про коллекции,
реализацию Map можно заменить на обычный массив и проходить по нему
по циклу.
В данном программе я определил интерфейс

Этот интерфейс реализует все события системы. Например – добавление


нового клиента.
В классе ClinicUI создаем карту, в который содержит все действия системы.

Таким образом, если в программе понадобиться добавить новое действие,


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

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


и проверять данные именно тестового события. Не затрагивая реальные
действия.