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

ВВЕДЕНИЕ В

ООП
9 ВВЕДЕНИЕ В ООП / Вспоминаем ООП

Вспоминаем ООП
Объектно-ориентированное программирование — это
методология программирования, в которой все важные
вещи представлены объектами, каждый из которых
является экземпляром определенного класса, а классы
образуют иерархию наследования.

Объекты, классы
Вы любите котиков? Надеюсь да, потому что я попытаюсь
объяснить все эти вещи на примерах с котами.

Это UML-диаграмма класса. В книге будет много таких диаграмм.


10 ВВЕДЕНИЕ В ООП / Вспоминаем ООП

Итак, у вас есть кот Пушистик. Он является объектом класса


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

Мурка, кошка вашей подруги, тоже является экземпляром


класса Кот . Она имеет такой же набор поведений и
свойств, что и Пушистик, а отличается от него лишь
значениями этих свойств — она другого пола, имеет другой
окрас, вес и т.д.

Объекты — это экземпляры классов.

Итак, класс — это своеобразный «чертёж», по которому


строятся объекты — экземпляры этого класса.
11 ВВЕДЕНИЕ В ООП / Вспоминаем ООП

Иерархии классов
Идём дальше. У вашего соседа есть собака Жучка. Как
известно, и собаки, и коты имеют много общего — имя, пол,
возраст, цвет есть не только у котов, но и у собак. Да и
бегать, дышать, спать и есть могут не только коты.
Получается, эти свойства и поведения присущи общему
классу Животных .

UML-диаграмма иерархии классов. Все классы на этой диаграмме являются


частью иерархии Животных .
12 ВВЕДЕНИЕ В ООП / Вспоминаем ООП

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


а его потомков — подклассами. Подклассы наследуют
свойства и поведения своего родителя, поэтому в них
содержится лишь то, чего нет в суперклассе. Например,
только коты могут мурчать, а собаки — лаять.

Мы можем пойти дальше, и выделить ещё более общий


класс живых Организмов , который будет родительским и
для Животных , и для Рыб . Такую «пирамиду» классов
обычно называют иерархией. Класс Котов унаследует всё
как из Животных , так из Оганизмов .

Классы на UML-диаграмме можно упрощать, если важно показать отношения


между ними.

Следует упомянуть, что подклассы могут переопределять


поведение методов, которые им достались от суперкласса.
При этом, они могут как полностью заменить поведение
метода, так и просто добавить что-то к результату
выполнения родительского метода.
13 ВВЕДЕНИЕ В ООП / Краеугольные камни ООП

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

Абстракция
Когда вы пишете программу, используя ООП, вы
представляете её части через объекты реального мира. Но
объекты в программе не повторяют в точности их реальные
аналоги, да и это редко когда нужно. Вместо этого, объекты
программы всего лишь моделируют поведение реальных
объектов, важных в том или ином контексте, а остальные
свойства реального объекта игнорируют.

Так, например, класс Самолёт будет актуален как для


программы тренажёра пилотов, так и для программы
14 ВВЕДЕНИЕ В ООП / Краеугольные камни ООП

бронирования авиабилетов, но в первом случае будут


важны детали пилотирования самолёта, а во втором —
лишь расположение и занятость мест внутри самолёта.

Разные модели одного и того же реального объекта.

Абстракция — это модель некоего объекта или явления


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

Инкапсуляция
Когда вы заводите автомобиль, вам достаточно повернуть
ключи зажигания или нажать кнопку. Вам не нужно вручную
соединять провода под капотом, поворачивать коленчатый
вал и поршни, запуская такт двигателя. Все эти детали
скрыты под капотом автомобиля. Вам доступен только
15 ВВЕДЕНИЕ В ООП / Краеугольные камни ООП

простой интерфейс — кнопка зажигания, руль и педали.


Таким образом, интерфейс — это публичная часть объекта,
доступная остальным объектам.

Инкапсуляция — это способность объектов скрывать часть


своего состояния и поведения от других объектов,
предоставляя внешнему миру только определённый
интерфейс взаимодействия с собой.

Например, вы можете инкапсулировать что-то внутри


класса, сделав его приватным ( private ) и скрыв доступ к
этому полю или методу для объектов других классов. Более
открытый режим видимости protected сделает это поле
или метод доступным в подклассах.

На идеях абстракции и инкапсуляции построены


механизмы интерфейсов и абстрактных классов/методов
большинства объектных языков программирования.

Многих путает, что словом «интерфейс» называют и


публичную часть объекта, и конструкцию interface
из большинства языков программирования.

В объектном языке программирования, с помощью


интерфейсов (обычно объявляемых через ключевое слово
interface ) можно явно описывать «контракты»
взаимодействия объектов.
16 ВВЕДЕНИЕ В ООП / Краеугольные камни ООП

Например, вы создали интерфейс ЛетающийТранспорт с


методом лететь(откуда, куда, пассажиры) , а затем описали
методы класса Аэропорта так, чтобы они принимали любые
объекты с этим интерфейсом. Теперь вы можете быть
уверены, что любой объект, реализующий интерфейс —
будь то Самолёт , Вертолёт или ДрессированныйГрифон ,
сможет работать с Аэропортом .

UML-диаграмма реализации и использования интерфейса.

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


интерфейс, не беспокоясь о том, что Аэропорт перестанет
быть с ними совместимым.
17 ВВЕДЕНИЕ В ООП / Краеугольные камни ООП

Наследование
Наследование — это возможность создание новых классов
на основе существующих. Главная польза от наследования
— повторное использование существующего кода. Расплата
за наследование проявляется в том, что подклассы всегда
следуют интерфейсу родительского класса. Вы не можете
исключить из подкласса метод, объявленный в его
родителе.

UML-диаграмма единичного наследования против реализации


множества интерфейсов.

В большинстве объектных языков программирования, класс


может иметь только одного родителя. Но с другой стороны,
класс может реализовывать несколько интерфейсов
одновременно.
18 ВВЕДЕНИЕ В ООП / Краеугольные камни ООП

Полиморфизм
Вернёмся к примерам с животными. Практически все
животные умеют издавать звуки, поэтому мы можем
объявить абстрактный метод издания звука в их базовом
классе. Все подклассы должны будут реализовать этот
метод по-своему.

UML-диаграмма единичного наследования против реализации


множества интерфейсов.

Теперь, представьте, что мы поместили нескольких собак и


котов в здоровенный мешок. Затем, мы будем с закрытыми
глазами вытаскивать их по одной из мешка. Вытянув
19 ВВЕДЕНИЕ В ООП / Краеугольные камни ООП

зверушку, мы не знаем какого она класса. Но если её


погладить, она точно издаст какой-то звук, зависящий от её
класса.

1 bag = [new
new Cat(), new Dog()];
2
3 foreach (Animal a : bag)
4 a.makeSound()
5
6 // Meow!
7 // Bark!

Здесь программе не известен конкретный класс объекта в


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

Полиморфизм — это способность программы выбирать


различные реализации, при вызове операций с одним и
тем же названием.

С другой стороны, полиморфизм — это способность


объектов притворяться чем-то другим. В приведённом выше
примере, собаки и коты «притворялись» абстрактными
животными.
20 ВВЕДЕНИЕ В ООП / Отношения между объектами

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

Ассоциация в UML-диаграммах. Профессор взаимодействует со студентами.

Ассоциация — это когда один объект использует другой,


либо зависит от него. В UML ассоциация обозначается
простой стрелкой, которая направлена в сторону
зависимости. Двустороння ассоциация между объектами
вполне допустима.

Композиция в UML-диаграммах. Университет состоит из кафедр.

Композиция — это отношение «часть-целое» между двумя


объектами, когда один из них включает в себя другой.
Особенность этого отношения заключается в том, что
компонент может существовать только как часть
контейнера. В UML композиция обозначается линией со
стрелкой на одном конце и заполненным ромбом на другом
21 ВВЕДЕНИЕ В ООП / Отношения между объектами

конце. Ромб направлен в сторону контейнера, а стрелка — в


сторону включаемого объекта.

Агрегация в UML-диаграммах. Кафедра содержит профессоров.

Агрегация — это менее строгий вариант композиции, когда


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

Вам также может понравиться