Добавлен: 14.06.2023
Просмотров: 185
Скачиваний: 5
Полиморфизм это возможность объектов с одинаковой спецификацией иметь различную реализацию.
Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования[1].
Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода. Общие свойства объектов объединяются в систему, которую могут называть по-разному — интерфейс, класс.
Практический смысл полиморфизма заключается в том, что он позволяет посылать общее сообщение о сборе данных любому классу, причем и родительский класс, и классы-потомки ответят на сообщение соответствующим образом, поскольку производные классы содержат дополнительную информацию. Программист может сделать регулярным процесс обработки несовместимых объектов различных типов при наличии у них такого полиморфного метода[3].
Полиморфизм, может быть, достигнут двумя способами:
- переопределение метода;
- перегрузка метода.
Переопределением (override) называют такую перегрузку методов, когда в классах, связанных отношением наследования, существуют методы с одинаковыми именами, количеством и типом параметров[6].
Рассмотрим на примере языка Java, который представлен в приложении 2.
Существует родительский класс A, в нем определен метод message(). В подклассе В родительский метод переопределен.
Запись @Override называется аннотацией и указывает, что метод базового класса должен быть переопределен. Если в базовом классе не окажется метода с аналогичной сигнатурой, то мы получим предупреждение компилятора о том, что метод переопределить невозможно. Аннотация не влияет на переопределение метода, но служит лишь для контроля успешности переопределения. Аннотацию можно удалить, но этого делать не надо, потому что в случае ошибки вместо переопределения будет выполнена перегрузка метода[1].
Таким образом, при переопределении методы должны иметь одинаковые сигнатуры и переопределяться могут только наследованные методы.
Перегрузка метода (overload) означает запись двух или более методов в одном классе с использованием того же имени метода, но параметры передачи отличаются. То есть она позволяет использовать одно и то же имя для нескольких методов с разными сигнатурами[3].
То есть, для перегрузки методов необходимо определить методы с одним и тем же именем, которые отличаются: количеством параметров, типом параметров, последовательностью типов параметров. Так как в процессе компиляции определяется, какой метод следует вызвать, основываясь на этих свойствах. Необходимо отметить, что имена параметров, тип возвращаемого значения и модификатор доступа метода в выборе требуемого метода не участвуют.
Итак, можно сделать вывод, что сущность полиморфизма заключается в том, что методы различных классов могут иметь одинаковые имена, но различное содержание. Это достигается переопределением родительского метода в классе-потомке: В результате родитель и потомок ведут себя по-разному. При этом обращение к одноименным методам различных объектов выполняется аналогично.
Из выше сказанного следует вывод, что основными характеристическими свойствами объектно-ориентированного программирования являются:
- Инкапсуляция - комбинирование записей с процедурами и функциями, манипулирующими полями этих записей, формирует новый тип данных - объект (под записью понимается переменная типа "запись").
- Наследование - определение объекта и его дальнейшее использование для построения иерархии порожденных объектов с возможностью для каждого порожденного объекта, относящегося к иерархии, доступа к коду и данным всех порождающих объектов.
- Полиморфизм - присваивание действию одного имени, которое затем совместно используется вниз и вверх по иерархии объектов, причем каждый объект иерархии выполняет это действие способом, именно ему подходящим.
Глава 3. Анализ объектно-ориентированные языков программирования
3.1 C++
История создания С++ начинается с языка С. С++ можно назвать расширенной и улучшенной версией языка С. В сравнении с его предшественником, наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.
Язык С++ был создан Бьерном Страуструпом в 1979 году в компании Bell Laboratories [5]. Сначала новый язык получил имя «С с классами», но в 1983 году он стал называться С++.
В 1997 году был принят международный стандарт С++, который обеспечил единообразие всех реализаций языка.
Язык С++ является универсальным языком программирования, в дополнение к которому разработан набор разнообразных библиотек.
Необходимо отметить, что он используется практически во всех областях науки, техники и производства.[4] Он позволяет удобно, эффективно и быстро разрабатывать программы, тестировать и изменять их. Его применяют для решения множества технических, научных и инженерных задач, а также для создания программ широкого пользования.
Этот язык программирования в настоящее время является одним из наиболее распространенных языков программирования в мире [8].
Текущий стандарт языка ISO/IEC 14882:2017 был опубликован в декабре 2017 года. Неофициально его обозначают как C++17. Следующая версия стандарта, запланированная на 2020 год, имеет неофициальное обозначение C++20.
Рассмотрим простой пример программы, который выводит сообщение «Hello, world!», используя стандартную библиотеку, и завершается.
#include <iostream>
using namespace std;
int main()
{
count << “Hello, world!” << end;
return 0;
}
При проектировании С++ Бьерн Страуструп придерживался следующим принципам и задачам, подтверждающие особенности данного языка программирования [8]:
- получить универсальный язык со статическими типами данных, эффективностью и переносимостью языка С;
- иметь возможность поддерживать множество стилей программирования, в том числе процедурное программирование, абстракцию данных, объектно-ориентированное программирование и обобщённое программирование;
- программист должен иметь свободу выбора, даже если он будет неверным;
- для быстрого и легкого перехода от языка программирования С, попытаться максимально сохранить совместимость с ним;
- необходимо избежать разночтений между С и C++, то есть любая конструкция, допустимая в этих языках, должна обозначать одно и то же и приводить к одинаковому результату программы[4];
- избегать особенностей, которые зависят от платформы или не являются универсальными;
- программирование на С++ не должно приводить к снижению производительности программы;
- не требовать слишком усложнённой среды программирования.
В настоящее время, многие программисты отмечают, что все эти принципы данного языка программирования реализованы, что делает его достаточно популярным в сфере информационных технологий[5].
3.2 Java
Java — объектно-ориентированный язык программирования, который разработала компания Sun Microsystems. Официальная дата выпуска является 23 мая 1995 года [6].
Объекты в Java представляют собой экземпляры класса. Работает на различных платформах, таких как Windows, Mac OS, а также различных версий UNIX.
Принцип работы приложений на Java заключается в том, что они транслируются в байт-код, который выполняется специальной виртуальной машиной (JVM), где она является программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.
Основным преимуществом такого способа выполнения программ является то, что байт-код не зависит от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности из-за того, что её исполнение полностью контролируется виртуальной машиной [6]. То есть, если какая-то операция превышает установленные полномочия программы, то происходит немедленное прерывание цикла. К таким операциям можно отнести - попытку несанкционированного доступа к данным или соединения с другим компьютером.
Часто к недостаткам концепции виртуальной машины относят то, что исполнение байт-кода виртуальной машиной может снижать производительность программ и алгоритмов, реализованных на языке Java. Как отмечают некоторые программисты, что время выполнения программ на Java в среднем в полтора-два раза больше, чем для C/C++[4].
Данное утверждение было справедливо для первых версий виртуальной машины Java, но в последнее время эта проблема практически теряет актуальность. В связи с некоторыми усовершенствования, такими как:
- применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде,
- широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках,
- аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).
Необходимо отметить, что идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине. Эти идеи нашли также выражение в спецификации общеязыковой инфраструктуры CLI, заложенной в основу платформы.NET компанией Microsoft [2].
Внутри Java существуют несколько основных семейств технологий:
- J2EE или Java EE (начиная с v1.5) — Java Enterprise Edition, для создания программного обеспечения уровня предприятия;
- J2ME, Java ME или Java Micro Edition, для использования в устройствах, ограниченных по вычислительной мощности, в том числе мобильных телефонах, КПК, встроенных системах;
- Java Card для использования в устройствах без собственного человеко-машинного интерфейса, например в смарт-картах.
Самыми известными и часто используемыми в сфере информационных технологий считаются серверные технологии семейства J2EE [5].
Выделяют следующие возможности языка программирования[6]:
- автоматическое управление памятью;
- расширенные возможности обработки исключительных ситуаций;
- богатый набор средств фильтрации ввода-вывода;
- набор стандартных коллекций: массив, список, стек и т. п;
- наличие простых средств создания сетевых приложений (в том числе с использованием протокола RMI).
- наличие классов, позволяющих выполнять HTTP-запросы и обрабатывать ответы;
- встроенные в язык средства создания многопоточных приложений, которые потом были портированы на многие языки (например Python).
- унифицированный доступ к базам данных, а именно на уровне отдельных SQL-запросов — на основе JDBC, SQLJ и на уровне концепции объектов, обладающих способностью к хранению в базе данных — на основе Java Data Objects (англ.) и Java Persistence API;
- поддержка обобщений (начиная с версии 1.5);
- поддержка лямбд, замыканий, встроенные возможности функционального программирования (с версии 1.8).
Рассмотрим пример использования данного языка программирования, который создаёт надпись «Hello World!».
Class NewClass {
Public static void main (String[] args)
{
System.out.println (“Hello World!”)
}
}
Успешные и известные проекты, реализованные с привлечением Java (J2EE) технологий, считаются - RuneScape, Amazon, eBay, LinkedIn, Yahoo!.
В настоящее время компании, которые в основном фокусируются на Java (J2EE) технологиях: SAP, IBM, Oracle. В основном, СУБД Oracle Database включает JVM как свою составную часть, обеспечивающую возможность непосредственного программирования СУБД на языке Java, включая, например, триггера [5].
3.3 Язык Python
Язык Python получил широкое распространение в сфере информационных технологий за счет своей простоты в изучении и использовании. Программный код на языке Python легко читать и писать, так как он не содержит сложного синтаксиса. Так же он позволяет уместить приложение в меньшее количество строк, чем на это потребовалось бы в других языках, таких как C++ или Java [4].
История этого языка программирования начинается в конце 1980-х годов сотрудником голландского института CWI (Центр математики и информатики, голл. Centrum Wiskunde & Informatica) Гвидо ван Россумом (англ. Guido van Rossum), на основе языка ABC.
На создания Python повлияли ранее созданные языки программирования такие, как:
- язык ABC: отступы для группировки операторов, высокоуровневые структуры данных;
- Modula-3: пакеты, модули;
- С, C++: некоторые синтаксические конструкции;
- Smalltalk: ООП [1];
- Java: обработка исключений и др.
Также большая часть других особенностей Python (например, байт-компиляция исходного кода) также была реализована ранее в других языках.
Необходимо отметить, что развитие языка происходит согласно четко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP (Python Enhancement Proposal) — предложений по развитию Python [9].
Можно выделить следующие особенности, которые отмечают в Python. Во-первых, он несложный язык программирования, что дает возможность сосредоточиться на решении задачи, а не на самом языке. Во-вторых, у него существует возможность встраиваться в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям или для ускорения работы программы. В-третьих, Python поставляется по принципу «все включено» (англ. Batteries Included) и имеет обширные возможности в стандартной библиотеке в дополнение к встроенным возможностям языка.[4] Где, в свою очередь, стандартная библиотека позволяет решать различные задачи, связанные с использованием регулярных выражений, генерацией документации, проверкой блоков кода, распараллеливанием процессов, базами данных, сетью Интернет, электронной почтой, криптографией, GUI (графическим интерфейсом пользователя) и другим системно-зависимым функционалом. В-четвертых, Python является свободным и открытым программным обеспечением (Free/Libré and Open Source Sotware – FLOSS).