Доброго времени суток, друзья!
В нашем прошлом уроке мы c Вами начали рассматривать парадигму Объектно-ориентированного подхода к программированию и к организации кода. Мы рассмотрели некоторые принципы оформления кода, познакомились с основными свойствами, наличие которых сообщает нам что стиль выполненного кода действительно относиться к ООП, а также получили теоретическое представление о том, что собой представляет первое свойство ООП которое носит название Наследование.
Сегодня, мы продолжим наше знакомство с теорией Объектно-ориентированного программирования. Пройдемся по оставшимся свойствам и начнем с Полиморфизма, ну и если осилим, то захватим оставшееся свойство, которое носит название Инкапсуляция.
Итак, давайте начнем.
УРОК 30. Объектно-ориентированное программирование. Часть II.
Полиморфизм.
Вот оно очередное страшное слово на нашем пути к заветной мечте – понять и преодолеть! На самом деле в это термине так же, как и в предыдущем не обнаружится ничего сложно. Но чтобы понять, что же такое есть этот самый Полиморфизм мы очень быстро напомним себе некоторую информацию из предыдущего урока, а именно схему описывающую принцип свойства Наследование. Вот она:
Итак, у нас есть общий Родитель в нашем случае Animal
и два Потомка, которые наследуют его свойства и методы это cat
и dog
. И, казалось бы, все отлично. Мы решили проблему с дублированием кода и каждый из потомков сразу при создании получил все необходимы нам «характеристики». Но (а «но» есть почти всегда) что если вдруг окажется, что хозяин нашей собаки решит, что с купированным хвостом его питомцу будет лучше?
То есть как бы у нашей собаки хвост изначально есть, но в последствии его уже как бы и нет. А судя по схеме Наследования он-то есть всегда. Как быть? Вот тут-то как раз и вступает в свою зону ответственности наш Полиморфизм. Само слово «Полиморфизм» делят на две составляющих это «поли» - переводится как множество, и «физмы» - переводится как формы. Другими словами, Полиморфизм - это множество форм. В нашем случае, это возможность представить наследуемое свойство или наследуемый метод в разнообразных формах, в том числе и отличных от той, которая идет как наследство от Родителя. Итак, давайте попробуем представить схему, которая будет включать в себя уже не только Наследование но и Полиморфизм. Выглядеть она будет примерно следующим образом:
В целом картина осталась такой же, как и раньше. Однако, обратите внимание на то что в Потомке dog
теперь появилось свое собственно свойство tail
(хвост). И значение этого свойства отлично от того которое было указано у Родителя Animal
и от того которое наследует другой Потомок - cat
.
Тут надо объяснить, что свойство, указанное непосредственно в потомке dog
будет иметь больший (с ударением на «о») приоритет чем свойство, которое описано у родителя. И именно для dog
, если мы в последствии будем как-то манипулировать свойством tail
, значение будет браться его собственное, а не родительское. То есть у нас есть одинаковое свойство, но как минимум уже две формы этого свойства присутствуют на схеме.
Надо понимать, что остальные свойства, наследуемые от Родителя Animal
остались у потомка dog
без изменений, у него так же, как и раньше осталось четыре лапы paws: 4
, возможность ходить walk: function() {}
, спать sleep: function() {}
и есть eat: function() {}
.
Все вышеперечисленное актуально не только для свойств, но и для методов. К примеру, предположим, что наша кошка cat
раньше работала с Юрием Куклачевым и она не просто умеет ходить, но и умеет это делать на двух передних лапах.
В этом случае мы подвергнем Полиморфизму уже не свойство, а метод walk
, и схема приобретет новый вид:
То есть если наша собака с купированным хвостом по-прежнему наследует возможность двигаться из Родителя и может просто ходить, то наш кот может и ходить, и ходить на двух передних лапах. При этом так же, как и в случае с собакой, остальные свойства и методы останутся у нашего кота без изменений и будут наследованы от Animal
.
Конечно же, при желании мы можем переопределить все свойства и методы, которые наследуются от Родителя, но в этом случае пропадет смысл в использовании самого Наследования. Это уже вопрос архитектуры как таковой и в больших компаниях, занимающихся разработкой серьёзных, сложных приложений в штате наряду с Разработчиками (Программистами) и Тестировщиками, вполне может присутствовать и Архитектор, который в общем-то и ответственен за обнаружение и устранение таких нюансов.
В общих чертах все вышеперечисленное и есть принцип, который лежит в основе Полиморфизма как свойства ООП
Инкапсуляция.
Следующее свойство, которое является отличительной чертой является Инкапсуляция. Возможно это одно из тех свойств, которые конечно проще показать с помощью кода, чем понятно объяснить теоретически, но мы были бы плохими разработчиками если бы не попытались выполнить нетривиальную задачу.
Итак, что же такое Инкапсуляция? Даже без точно перевода, а просто основываясь на самом названии, мы уже можем представить себе, что это такое. «Ин» - то есть внутрь и «капсул» - оболочка, капсула. Другими словами, Инкапсуляция это помещение чего-то внутрь оболочки. А как мы знаем из научно-фантастических фильмов, капсула как правило цельная и герметичная. Соответственно добраться до ее содержимого напрямую весьма затруднительно. Вот и получается, что Инкапсуляция в ООП вступает в дело, когда нам требуется спрятать свойство или метод от прямого программного доступа.
Давайте попробуем представить это графически. Для этого мне придется написать немного кода. Но сам код мы рассматривать пока не будем, нам лишь потребуется работа Консоли в Браузере чтобы наглядно показать, что я имею в виду.
Итак, смотрите. У нас есть Родитель и у два его Потомка: cat
и dog
. Вот мы можем наблюдать их в Консоли Браузера:
Мы видим, что нам доступны и Родитель Animal
и у eго Потомков cat
и dog
есть набор свойств и методов, которые они наследуют. Давайте попробуем получить к ним прямой программный доступ. Как это сделать? Очень просто. Мы вызовем их, как и любой другой метод объекта:
В данном случае мы использовали кота, но поверьте мне (пока на слово) для собаки эти вызовы отработают точно так же. То есть прямым программным методом (обычным вызовом через точку) мы получаем доступ и к свойствам и методам наших Потомков.
Но допустим, что нам по какой-то причине не хочется, чтобы мы могли напрямую узнать сколько у кошки лап, и сколько хвостов. Ну вот стесняется наша кошка таких принадлежностей и не хочет их показывать, и живет исключительно в своей коробке с балдахином. Давайте попробуем посмотреть, как это может выглядеть в Консоли:
Видите, теперь свойства tail
и paws
пропали из общего списка свойств и методов, которые были унаследованы от Родителя, потому что мы их скрыли или другими словами Инкапсулировали от прямого программного доступа. И теперь если мы попробуем добраться до них напрямую так как мы это делали на предыдущем скриншоте, то мы получим сообщение:
То есть количество лап у кошки спрятано от наших глаз. Однако мы то знаем, что они есть, и если мы не можем достать их напрямую, то мы сможем «вскрыть капсулу» с информацией о наших лапах используя «инструмент». Для этого я создал такой инструмент в виде методов getHowManyPaws
и если мы воспользуемся им, то без труда узнаем сколько же на самом деле лап у нашего питомца кота:
И вот мы видим, что все в порядке и лапы нашего питомца на месте, но просто мы их не видим напрямую.
Вот такая суть Инкапсуляции в парадигме ООП.
Ну а в нашем следующем уроке, мы наконец-то отойдем от теории, и попробуем разобрать каждое из пройденных нами свойств практически используя JavaScript.
А на сегодня все.
Ссылки на предыдущие уроки:
Урок 1 - Окружение.,
Урок 2 - Некоторые особенности синтаксиса.,
Урок 3 - Переменные.,
Урок 4 - Типы переменных, как основа для их взаимодействия.,
Урок 5 - Операции с переменными одного типа.,
Урок 6 - Операции с переменными одного типа. Часть II.,
Урок 7 - Взаимодействие переменных с разными типами.,
Урок 8 - Взаимодействие переменных разного типа. часть II.,
Урок 9 - Взаимодействие переменных разного типа. Часть III.,
Урок 10 - Другие возможные взаимодействия между переменными.,
Урок 11 - Другие возможные взаимодействия между переменными. Часть II.,
Урок 12 - Другие возможные взаимодействия между переменными. Операторы присваивания.,
Урок 13 - Другие возможные взаимодействия между переменными. Операторы сравнения.,
Урок 14 - Сложные переменные. Array и Object.,
Урок 15 - Условные операторы.),
Урок 16 - Циклы.,
Урок 17 - Циклы. Часть II.,
Урок 18 - Функции.,
Урок 19 - Функции. Часть II.,
Урок 20 - Профилирование. Функции, часть III.,
Урок 21 - Функции, Часть IV. Аргументы.,
Урок 22 - Objects (Объекты).,
Урок 23 - Встроенные функции и объекты.,
Урок 24 - Встроенные функции и Объекты, Часть II. Глобальные функции и переменные.,
Урок 25 - Встроенные функции и Объекты, Часть III. Document Object Model.,
Урок 26 - Встроенные функции и Объекты, Часть III. Document Object Model.
Урок 27 - Встроенные объекты. Объект Style, Events, Часть II.
Урок 28 - Встроенная переменная this. Глобальная и локальная области видимости.
Урок 29 - Объектно-ориентированное Программирование. Введение.
@rassen Поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награду за количество голосов
Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
Голосуя за это уведомление, вы помогаете всем пользователям Голоса. Узнайте, как здесь.