Объектно-ориентированное программирование (часть 2)

Объясняется с использованием Java; тем не менее, темы могут быть реализованы на большом количестве других языков, просто нужно следовать синтаксису языка!

Теперь, когда мы рассмотрели объекты и классы, мы можем начать глубокое погружение в последние столпы объектно-ориентированного программирования: наследование, полиморфизм, абстракции и инкапсуляции.

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

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

Как видно из этого примера, я могу использовать атрибуты из класса животных внутри при определении объекта собаки! В настоящее время у нас есть только один дочерний класс, поэтому написание такого кода не экономит много времени. Однако представьте, что вы отвечаете за программирование игры с интерактивной дикой природой. Создавая родительские классы с общими характеристиками животных и наследуя их повсюду, вы можете свести к минимуму объем кода, который вам придется писать.

В этом примере мы создали класс животных, содержащий переменную еды и сна. Класс животных содержит эти переменные, поскольку они являются общими характеристиками для всех животных. Записывая общие атрибуты в один класс (класс Animal) и расширяя его на подклассы, мы избавляем себя от написания повторяющегося кода.

Полиморфизм

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

Статический полиморфизм

Статический полиморфизм достигается за счет методов перегрузки. Если вы читали мою первую часть об объектно-ориентированном программировании, вы уже познакомились с идеей перегрузки методов (написание нескольких конструкторов). Методы с одинаковым именем, но разными параметрами считаются перегруженными. Это чрезвычайно полезно, поскольку в зависимости от вводимых данных можно ожидать, что объект будет вести себя по-разному.

Динамический полиморфизм

Динамический полиморфизм достигается за счет перезаписи методов или при создании экземпляров объектов.

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

Вторая причина использования динамического полиморфизма — создание абстрактных объектов. С динамическим полиморфизмом мы могли бы сделать следующее.

Созданный объект на самом деле является объектом собаки. Ключевое слово Animal предназначено для указания типа данных. В данном случае это дает нам понять, что собака будет объектом. Создавая такие объекты, мы можем абстрагироваться от создания объектов. Можно было добиться следующего.

Здесь мне удалось создать сто животных, пятьдесят летучих мышей и пятьдесят собак всего за шесть строк кода!

Абстракция

Прежде чем я начну объяснять, что такое абстракция, я хотел бы задать вам вопрос. Не торопитесь, чтобы подумать об этом, прежде чем продолжить. Что такое животное?

Вы, вероятно, изо всех сил пытались дать четкий ответ о том, что такое животное, и это нормально, на самом деле это то, что ожидается. У всех нас есть абстрактное представление о том, что такое животное. С другой стороны, если бы я спросил, что такое собака? Я уверен, что большинство людей смогли бы нарисовать более ясную картину того, что такое собака, и даже привести пример.

Абстракция определяется как процесс сокрытия деталей реализации от пользователя. С точки зрения непрофессионала, абстракция создает базовый стандарт для объектов, но мы не можем использовать этот стандарт.

Используя этот пример, мы видим, что класс животных имеет базовый стандарт того, на что должны быть способны собака, лев и летучая мышь. Установив «сон» как атрибут животных, мы создаем стандарт, согласно которому все животные должны спать. Однако, исходя из предыдущей идеи динамического полиморфизма, мы согласны с тем, что все животные спят по-разному. Следовательно, сон — это абстрактное понятие, общее для всех животных.

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

  • Мы заявляем, что все подклассы должны иметь эти общие характеристики
  • Абстрактный класс — это представление о том, что представляют собой все подклассы.

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

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

Я оставил инкапсуляцию напоследок, так как это то, что мы постоянно делаем, не осознавая этого. Инкапсуляция — это просто то, как вы связываете методы и атрибуты. Это означает, что все созданные нами классы следуют принципу инкапсуляции ООП.

На этом мы рассмотрели фундаментальные принципы объектно-ориентированного программирования. До скорого.

Удачного кодирования!