Совместное использование полиморфизма, инкапсуляции и наследования



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

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

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

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

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

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

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



Руководство C# | Основы объектно-ориентированного программирования

99

C# — Руководство по C# — Основы объектно-ориентированного программирования

Все основанные на объектах языки (C#, Java, С++, Smalltalk, Visual Basic и т.п.) должны отвечать трем основным принципам объектно-ориентированного программирования (ООП), которые перечислены ниже:

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

Как данный язык скрывает детали внутренней реализации объектов и предохраняет целостность данных?

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

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

Полиморфизм

Как данный язык позволяет трактовать связанные объекты сходным образом?

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

Роль инкапсуляции

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

объект — это элемент, поддерживающий инкапсуляцию.

Т.е. инкапсуляция представляет собой способности языка скрывать излишние детали реализации от пользователя объекта. Например, предположим, что используется класс по имени DatabaseReader, который имеет два главных метода: Open() и Close().

Фиктивный класс DatabaseReader инкапсулирует внутренние детали нахождения, загрузки, манипуляций и закрытия файла данных. Программистам нравится инкапсуляция, поскольку этот принцип ООП упрощает кодирование.

Нет необходимости беспокоиться о многочисленных строках кода, которые работают «за кулисами», чтобы реализовать функционирование класса DatabaseReader. Все, что потребуется — это создать экземпляр и отправлять ему соответствующие сообщения (например, «открыть файл по имени AutoLot.mdf, расположенный на диске С:»).

С идеей инкапсуляции программной логики тесно связана идея защиты данных. В идеале данные состояния объекта должны быть специфицированы с использованием ключевого слова private (или, возможно, protected). Таким образом, внешний мир должен вежливо попросить, если захочет изменить или получить лежащее в основе значение. Это хороший принцип, поскольку общедоступные элементы данных можно легко повредить (даже нечаянно, а не преднамеренно).

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

Код и данные, составляющие вместе класс, называют членами. Данные, определяемые классом, называют полями, или переменными экземпляра. А код, оперирующий данными, содержится в функциях-членах, самым типичным представителем которых является метод. В C# метод служит в качестве аналога подпрограммы. (К числу других функций-членов относятся свойства, события и конструкторы.) Таким образом, методы класса содержат код, воздействующий на поля, определяемые этим классом.

Роль наследования

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

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

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

Роль полиморфизма

Последний принцип ООП — полиморфизм. Он обозначает способность языка трактовать связанные объекты в сходной манере. В частности, этот принцип ООП позволяет базовому классу определять набор членов (формально называемый полиморфным интерфейсом), которые доступны всем наследникам.

Полиморфный интерфейс класса конструируется с использованием любого количества виртуальных или абстрактных членов.

По сути, виртуальный член — это член базового класса, определяющий реализацию по умолчанию, которая может быть изменена (или, говоря более формально, переопределена) в производном классе. В отличие от него, абстрактный метод — это член базового класса, который не предусматривает реализации по умолчанию, а предлагает только сигнатуру. Когда класс наследуется от базового класса, определяющего абстрактный метод, этот метод обязательно должен быть переопределен в производном классе. В любом случае, когда производные классы переопределяют члены, определенные в базовом классе, они по существу переопределяют свою реакцию на один и тот же запрос.

Рассмотрим для примера стек, т.е. область памяти, функционирующую по принципу «последним пришел — первым обслужен». Допустим, что в программе требуются три разных типа стеков: один — для целых значений, другой — для значений с плавающей точкой, третий — для символьных значений. В данном примере алгоритм, реализующий все эти стеки, остается неизменным, несмотря на то, что в них сохраняются разнотипные данные. В языке, не являющемся объектно-ориентированным, для этой цели пришлось бы создать три разных набора стековых подпрограмм с разными именами. Но благодаря полиморфизму для реализации всех трех типов стеков в C# достаточно создать лишь один общий набор подпрограмм. Зная, как пользоваться одним стеком, вы сумеете воспользоваться и остальными.

В более общем смысле понятие полиморфизма нередко выражается следующим образом: «один интерфейс — множество методов«. Это означает, что для группы взаимосвязанных действий можно разработать общий интерфейс. Полиморфизм помогает упростить программу, позволяя использовать один и тот же интерфейс для описания общего класса действий. Выбрать конкретное действие (т.е. метод) в каждом отдельном случае — это задача компилятора. Программисту не нужно делать это самому. Ему достаточно запомнить и правильно использовать общий интерфейс.

ООП в Java: инкапсуляция, наследование, полиморфизм, абстракция

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

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

OOPS — это разработка приложения вокруг его данных, то есть объектов, которые по-своему обеспечивают доступ к своим свойствам и возможным операциям.

Абстракция

Одной из самых фундаментальных концепций ООП является Абстракция . Абстракция — это процесс, при котором вы показываете только «актуальные» данные и «прячете» от пользователя ненужные детали объекта. Например, когда вы входите в свою учетную запись Amazon в Интернете, вы вводите свой user_id и пароль и нажимаете «Войти», что происходит, когда вы нажимаете «Войти», как входные данные, отправленные на сервер Amazon, как они проверяются — все это абстрагируется от вас.

Другой пример абстракции: автомобиль сам по себе является четко определенным объектом, который состоит из нескольких других более мелких объектов, таких как система передач, рулевой механизм, двигатель, которые также имеют свои собственные подсистемы. Но для человека автомобиль – это единый объект, которым можно управлять с помощью своих подсистем, даже если их внутренние детали неизвестны.

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

В этом посте дается теоретическое объяснение инкапсуляции с примерами из реальной жизни. Для подробного объяснения этой темы с помощью java-программ обратитесь к инкапсуляции в java с примером.

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

  • Связывание данных с кодом, который ими управляет.
  • Защищает данные и код от внешнего вмешательства

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

Точно так же ту же концепцию инкапсуляции можно применить к коду. Инкапсулированный код должен иметь следующие характеристики:

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

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

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

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

В этом посте дается теоретическое объяснение наследования с примерами из реальной жизни. Для подробного объяснения этой темы с программами Java обратитесь к наследованию с примерами и типами наследования в java.

  • Наследование — это механизм, посредством которого объект приобретает некоторые/все свойства другого объекта.
  • Поддерживает концепцию иерархической классификации.

Например: Автомобиль — это четырехколесное транспортное средство, поэтому предположим, что у нас есть класс FourWheeler и его подкласс с именем 9.0066 Автомобиль . Здесь Автомобиль приобретает свойства класса FourWheeler . Другими классификациями могут быть джип, темп, фургон и т. д. FourWheeler определяет класс транспортных средств, которые имеют четыре колеса, и определенный диапазон мощности двигателя, грузоподъемность и т. д. Автомобиль (называемый подклассом) приобретает эти свойства от FourWheeler, и имеет некоторые специфические свойства, которые отличаются от других классификаций FourWheeler, таких как роскошь, комфорт, форма, размер, использование и т. д.

Автомобиль может иметь дополнительную классификацию, такую ​​как открытый автомобиль, маленький автомобиль, большой автомобиль и т. д., которые получит свойства как от Four Wheeler, так и от Car, но все же будет иметь некоторые специфические свойства. Таким образом, уровень иерархии может быть расширен до любого уровня.

Классы Java Swing и Awt представляют собой наилучшие примеры наследования.

Полиморфизм

В этом посте дается теоретическое объяснение полиморфизма с примерами из реальной жизни. Для подробного объяснения этой темы с java-программами обратитесь к полиморфизму в java и времени выполнения и полиморфизму времени компиляции.

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

Давайте посмотрим на тот же пример автомобиля. Автомобиль имеет зубчатую трансмиссию. Он имеет четыре передачи переднего хода и одну передачу заднего хода. Когда двигатель разгоняется, в зависимости от того, какая передача включена, к автомобилю передается разная мощность и движение. Действие такое же, как и при использовании снаряжения, но в зависимости от типа снаряжения действие ведет себя по-разному, или вы можете сказать, что оно показывает много форм (полиморфизм означает множество форм)

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

  • Перегрузка простыми словами означает наличие нескольких методов с одинаковым именем, которые ведут себя по-разному в зависимости от аргументов, переданных при вызове метода. Это называется статическим, потому что метод, который следует вызывать, определяется во время компиляции
  • .
  • Переопределение означает, что производный класс реализует метод своего суперкласса. Вызов метода переопределения разрешается во время выполнения, что называется полиморфизмом во время выполнения 9.0035

❮ ПредыдущийСледующий ❯

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

Объектно-ориентированное программирование относится к концепции языков высокого уровня, таких как Java и Python, которая использует объекты и классы в своих реализациях. ООП состоит из четырех основных строительных блоков: полиморфизма, инкапсуляции, абстракции и наследования. Существуют и другие парадигмы программирования, такие как процедурное программирование, в котором коды записываются последовательно. Python и Java — мультипарадигмальные языки программирования высокого уровня, что означает, что они поддерживают как ООП, так и процедурное программирование. Программист решает, какую парадигму использовать, основываясь на своем опыте и проблемах, которые он пытается решить. Однако никто не спорит, что ООП делает программирование проще, быстрее, динамичнее и безопаснее. Это главная причина, по которой Java и Python сегодня являются самыми популярными языками программирования в мире 9.0003

Если вы хотите изучать Java и Python или любые другие языки объектно-ориентированного программирования, то вы должны понимать эти парадигмы объектно-ориентированного программирования, которые относительно легко понять. Давайте посмотрим на них.

Что такое наследование?

В Java и Python код записывается в объектах или блоках, если вы используете методологию ООП. Объекты могут взаимодействовать друг с другом, используя свойства каждого блока или расширяя функциональные возможности блока посредством наследования. Наследование гарантирует повторное использование кодов. Существуют миллионы библиотек Java и Python, которые программист может использовать посредством наследования. Свойства класса могут наследоваться и расширяться другими классами или функциями. Есть два типа классов. Один из них — родительский или базовый класс, а другой — дочерний класс, который может наследовать свойства родительского класса. Наследование является одним из основных столпов объектно-ориентированного программирования. Это механизм, с помощью которого классы в Java, Python и других языках ООП наследуют атрибуты других классов 9.0003

Родительский класс может делиться своими атрибутами с дочерним классом. Пример реализации родительского класса находится в DDL (библиотека динамической компоновки). DDL может содержать различные классы, которые могут использоваться другими программами и функциями

Реальный пример наследования — мать и ребенок. Ребенок может наследовать такие атрибуты, как рост, темпы голоса, цвет. Мать также может воспроизводить других детей с теми же атрибутами

Вы можете создать функцию или класс под названием «Move Robot», который управляет движением робота. И вы можете создать метод и функции в других программах, которые могут наследовать «Move Robot». Robot» без переписывания кодов снова и снова. Вы также можете расширить этот класс, унаследовав его и написав для него еще несколько кодов, которые будут указывать роботу двигаться, а также работать в некоторых конкретных обстоятельствах, используя операторы if и else. Благодаря наследованию вы можете создавать несколько роботов, которые будут наследовать атрибуты родительского класса «Move Robot», что обеспечивает возможность повторного использования кода9.0003

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

Когда мы хотим создать функцию, метод или класс, мы ищем суперкласс, который содержит код или часть кода, который мы хотим реализовать. Затем мы можем вывести наш класс из существующего. В Java мы делаем это, используя ключевое слово «Extends», а в Python мы достигаем этого, наследуя атрибуты класса, вызывая имя класса. 

________________________________________________________________________________________________________________________________

Вы работаете в отделе операций?
Знаете ли вы, что такое приложение, как NerdVision, может улучшить MTTR (среднее время ремонта)?

________________________________________________________________________________________________________________________________

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

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

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

По сути, инкапсуляция связывает данные и код как единое целое и обеспечивает модульность.

Полиморфизм

Полиморфизм означает существование во многих формах. Переменные, функции и объекты могут существовать в различных формах в Java и Python. Существует два типа полиморфизма: полиморфизм времени выполнения и полиморфизм времени компиляции. Время выполнения может принимать другую форму во время работы приложения, а время компиляции может принимать другую форму во время компиляции.

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

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

Программные коды будут работать по-разному в другой операционной системе. Способность программного кода проявлять различное поведение в операционной системе известна как полиморфизм в ООП. Вы можете создать класс под названием «Move», а затем четыре человека создают животных, которые наследуют класс Move. Но мы не знаем, каких животных они создали. Таким образом, полиморфизм позволил бы животным двигаться, но в разных формах в зависимости от физических особенностей

A создает улитку, которая наследует класс движения, но улитка будет ползать

B создает кенгуру, который наследует класс движения, но кенгуру будет прыгать

C создает собаку, которая наследует класс движения, но собаки будут walk

D создает Fish, который наследует класс move, но Fish будет плавать.

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

________________________________________________________________________________________________________________________________

Разработчики и операторы должны работать вместе для достижения успеха.
Приложение NerdVision объединяет эти две команды, чтобы сделать жизнь каждого лучше.0006

Абстракция в Java и Python — это методология программирования, в которой детали программных кодов скрыты от пользователя, а для пользователя отображаются только важные вещи. Абстракция связана с идеями, а не с событиями. Это похоже на то, как пользователь запускает программу (веб-браузер), не видя фоновых кодов. Абстракция достигается либо в абстрактных классах, либо в интерфейсе на Java и Python. NetBeans и Eclipse IDE реализуют абстракцию для Java, а Django реализует абстракцию для Python.

Программист использует интегрированную среду разработки для разработки пользовательского интерфейса, не беспокоясь о том, как среда IDE генерирует коды HTML. По сути, абстракция отображает важные детали только для пользователя.

Заключение 

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