Особенности объектно-ориентированного программирования на C++/CLI, C# и Java. 2-е издание

Особенности объектно-ориентированного программирования на C++/CLI, C# и Java. 2-е издание
Автор: Медведев В.И.
Год: 2010
ISBN: 978-5-4233-0007-4
Страниц: 444
Язык: Русский
Формат: PDF
Размер: 11 Мб

Download

Излагаются основные понятия и методика разработки объектно-ориентированных программ на языках C++/CLI, C# и Java (J#). Изложение сопровождается многочисленными примерами законченных программ. Программы поясняются диаграммами языка UML. Особое внимание акцентировано на наиболее сложных для понимания делегатах, событиях, уведомлениях, потоках и их синхронизации. Параллельное изложение схожих основных языковых конструкций позволит лучше выявить не только близость и различие языков C++/CLI, C# и Java, но и лучше понять особенности этих языков. Для студентов и преподавателей вузов по направлению вычислительной техники и информатики. Представляет интерес для всех, знающих язык С и изучающих объектно-ориентированное программирование, а также для тех, кто, овладев языком С++, интересуется особенностями и отличиями программирования на языках C++/CLI, Java(J#) и C#.

+

Развитие объектно-ориентированного программирования и Internet способствовало появлению новой технологии программирования – .NET технологии. позволяющей на единой платформе разрабатывать компоненты программ на разных языках программирования и обеспечить их совместное выполнение. В рамках .NET технологии предложен новый язык программирования С#, основанный на языке C++ и перенявший из языка Java черты, обеспечивающие создание безопасных программ. С учётом .NET технологии язык C++ расширен новыми возможностями и получил название C++/CLI, появился также язык J# – язык Java применительно к .NET технологии.

Язык C# разработан после языка Java. Он не только наследовал лучшее из языка Java, но модифицировал его, придав стройность и удобство использования, например, таких конструкций как делегаты и события. Но, будучи открытым и легко доступным из сайта фирмы Sun Microsystems в Интернете, язык Java, пожалуй, стал самым популярным языком программирования в мире. Сайт фирмы Sun Microsystems доступен программистам всего мира. Доступность сайта объединила профессиональных программистов, неравнодушных к судьбе языка Java, способствуя продвижению компонентно-ориентированного программирования на этом языке.

Предложенный фирмой Microsoft язык J#, являющийся вариантом языка Java для .NET платформы, может использовать (импортировать – import) как библиотеку .NET Framework, так и библиотеку Java.

В данной книге акцентировано внимание на принципиальных понятиях языков программирования C++/CLI, C# и Java(J#), без понимания которых немыслима разработка программ, состоящих из множества объектов с потоками, которые взаимосвязаны не только посредством своих интерфейсов, но и с помощью событий и уведомлений. Используемые при этом конструкции языков C++/CLI, C# и Java по своему своеобразны и для лучшего понимания рассматриваются в книге параллельно, отражая их отличия и сходство, с иллюстрацией примеров программ.

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

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

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

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

В качестве сред реализации приводимых примеров программ использованы среды разработки Visual Studio .NET и Eclipse , языки программирования C++/CLI, С#, Java и J#, а также библиотека .NET Framework и библиотеки (пакеты) языка Java.

Книга состоит из 13 разделов.

В первом и втором разделах изложены основные сведения об изучаемых языках и базовые понятия объектно-ориентированного программирования.

Об управляемом и неуправляемом коде и особенностях его применения на разных языках рассмотрено в третьем разделе.

Основные отличия языков C++/CLI, C# и Java от языка С, включая классы, приведены в четвёртом и пятом разделах.

Шестой раздел посвящён важнейшим понятиям объектно-ориентированного программирования – классам и интерфейсам.

На примере разработки простой программы ввода-вывода информации о компьютерах седьмого раздела ясно видны отличия программного кода на языках C++/CLI и С#.

Восьмой раздел посвящён управляемым данным, отличию их использования в языках C++/CLI и C# и уведомлениям в языке Java.

Девятый раздел рассказывает об особенностях создания, использования и синхронизации параллельного выполнения потоков на языках C# и Java.

В десятом разделе рассматриваются основные классы библиотеки .NET Framework и библиотек Java, используемые в дальнейшей части книги и достаточные для написания многочисленных программ на С#, управляемом СИНУСЫ и языке Java. Уделено внимание и обработке исключений, применяющихся при возникновении аварийных ситуаций.

Одиннадцатый раздел иллюстрирует использование библиотеки .NET Framework и пакетов языка Java при поэтапной разработке многопоточного приложения на языках C# и J# в среде Visual Studio .NET.

В двенадцатом разделе приводятся задачи для самооценки приобретённых знаний и умений.

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

Для большей наглядности при разработке ряда программ книги использован графический универсальный язык моделирования UML (Unified Modeling Language), широко распространённый при создании сложных объектно-ориентированных систем.

Книга базируется на лекционном курсе, читаемом автором на факультете технической кибернетики и информатики Национального исследовательского университета имени А.Н.Туполева (бывший КАИ – Казанский авиационный институт).

Языкам C++/CLI, C# и Java посвящены многие книги, излагающие их подробно, многогранно и профессионально. Цель данной книги – дать базовые знания об этих языках в объёме, достаточном для разработки консольных и оконных приложений, использующих объекты с потоками, событиями, делегатами, взаимодействующих с интерфейсными элементами. Читатели освоят основные классы библиотек, родных для языков C# и Java, поймут их сходство и различие на рассматриваемых в книге программах, параллельно реализующих одни и те же задачи. Надеюсь, что эта книга стимулирует дальнейшее освоением более полюбившегося языка программирования.

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

В конце книги в приложениях I и 2 приводится полностью программа на языке C# и языке J#, разработанная поэтапно в одиннадцатом разделе. Приложение 3 содержит сведения о средах разработки, достаточные для реализации приведённых в книге примеров программ.

Также в конце книги приведён перечень примеров программ и предметный указатель.

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

О языках C++, C++/CLI, Java, J# и C#

В настоящее время языки C++, Java и C# являются наиболее потребными языками объектно-ориентированного программирования.

Язык C++ создан в 1979 году Бьёрном Страуструпом (Bjarnc Straustrup) как расширение широко популярного языка программирования С. Первоначальное название нового языка “С с классами” впоследствии было измснёно на укоренившееся “C++”. Обогатив широко используемый программистами язык С конструкциями, позволяющими реализовать принципы объектно-ориентированного подхода при разработке программ, создатель не решился существенно изменить полюбившийся язык С, оставив используемые типы, операторы, указатели и др. Так в язык C++ перешли конструкции, благоприятствующие появлению ненадёжных программ в руках недостаточно квалифицированных программистов. Из этого языка, обладающего богатыми возможностями, были в дальнейшем задействованы основные конструкции для языка Java, а потом – С#. При этом языки Java и C# были реализованы, позволяя как простое создание и использование компонентов, так существенное повышение надёжности и защищенности многокомпонентных программ, правда проигрывая языку C++ в эффективности их выполнения. Меньшая эффективность обусловлена применением языками Java и C# специальных сред выполнения программного кода. Неуправляемый программный код языка C++ превратился в управляемый программный код в языках Java и С#. Но управляемый код, обладающий дополнительной информацией, внёс новое качество в компоненты и компонентно-ориентированное программирование, существенно расширив возможности разработчиков.

В 1991 году Джеймс Гослинг (James Gosling), Патрик Ноутон (Patric Naughton), Крис Вирт (Chris Warth), Эд Франк (Ed Frank) и Майк Шеридан (Mike Sheridan) предложили язык Java для разработки программного обеспечения контроллеров. Поскольку разные контролеры реализуют различные машинные языки, пришлось ввести так называемую виртуальную машину JVM (JVM – Java Virtual Machine). Для каждого типа контроллера создавалась своя виртуальная машина, которая выполняла программу, представленную на едином для всех компиляторов языка Java промежуточном языке. Располагая компилятором языка Java, достаточно для внедрения Java программы на некотором процессоре установить соответствующую этому процессору виртуальную машину JVM.

Итак, JVM машина решила проблему переносимости (мобильности) программного кода. Но не только это. Наличие особой среды выполнения управляемого кода повысило защищённость и надёжность программ и позволило через управляемый код обеспечить передачу между программными компонентами информации, отражающей содержащиеся в них данные. Отражение (reflection), раскрывающее скрытое нутро программного компонента, облегчило взаимосвязь удалённых объектов компонентов, размещенных на сервере с их представителями (прокси – proxy) на клиенте.

Язык С#, созданный под руководством Андерса Хейльсберга, появился в середине 2000 года как основной язык .NET платформы фирмы Microsoft. Программный компонент, написанный на любом языке .NET платформы (С#, J#, Visual Basic и др.), компилируется на промежуточный язык MSIL (MSIL -Microsoft Intermediate Language) и затем выполняется в среде CLR (CLR -Common Language Runtime). Теперь многокомпонентную программу можно составить из разноязычных компонентов, обеспечив их взаимосвязь, как с помощью интерфейсов, так и посредством отражений.

Базирующиеся на языках С и C++, языки Java и C# во многом схожи, но во многом и отличны. Но один и тот же подход при их реализации применительно к создаваемому ими переносимому коду и применению делегирования делает эти языки интересными для изучения и сравнения. Программирование на Java и С#, действительно, доставляет удовольствие.

Среда разработки Visual Studio всегда содержала компилятор языка C++. Этот язык, имевший название Visual C++, изменялся, меняя свои версии. Широко известны библиотеки MFC и ATL, применявшиеся с этим языком. Вполне естественно, что появившаяся новая среда разработки Visual Studio.NET сохранила этот знаменитый язык, модифицировав его применительно к .NET платформе.

Создатели языка C++.NET платформы .NET, переименованного потом в язык C++/CLI, изменили язык C++, добавив в него средства создания и выполнения как неуправляемого, так и управляемого кода. Будучи родным для платформы .NET, язык C++/CLI облегчил разработку программ, включающих как управляемый, так и неуправляемый коды, позволяя их объединить.

Язык C++/CLI образует мост между неуправляемым и управляемым кодом и поэтому представляет интерес для профессиональных программистов, разрабатывающих программные системы, некоторые компоненты которых реализуются на эффективном неуправляемом коде.

Заметим, что каждый из языков Java и C# по-своему специфичен и содержит свои особенности, с которыми можно познакомиться по многочисленной литературе. Но эти языки, как наследники языка С-н-, содержат единое нутро, которое их объединяет, которое обозримо и позволяет создавать программы и которое также позволяет рассмотреть эти языки параллельно, чтобы понять то, что их объединяет и то, что их отличает. Этому и посвящена данная книга.

Рассмотрение языка C++/CLI позволит не только понять отличие неуправляемого и управляемого кода, но и написать программы, использующие только управляемый или неуправляемый код. Разработанные одной и той же фирмой, языки C++/CLI и C# содержат настолько схожие средства работы с управляемыми данными, что внешне их программы выглядят схоже и просто преобразуются одна в другую. Поэтому параллельное изучение этих языков

обоснованно и представляет большой интерес. Что же касается языка Java, то этот язык очень схож с языком С#. Реализация языка Java для .NET платформы (язык J#), позволяет воспользоваться не только библиотекой .NET Framework, используемой тремя языками, но и родными пакетами языка Java. Это позволяет в среде Visual Studio.NET параллельно изучить не только три языка с библиотекой .NET Framework, но и язык J# с родными библиотеками Java. В книге также использована и родная среда Eclipse для языка Java.

Основные понятия объектно-ориентированного программирования

Объекты

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

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

По их состоянию и поведению объекты разделяются на типы. Однотипные объекты имеют схожее состояние и поведение.

В языках программирования C++, Java и C# однотипные объекты описываются схоже со структурой языка С, элементами которой теперь являются не только объявления данных, представляющих состояние объекта, но и объявления (или описания) функций (методов), определяющих его поведение. Этот вновь введённый тип, описывающий объекты и отсутствующий в языке С, но появившийся в языках C++, Java и С# называется классом (class). Из класса создаются переменные типа class, называемые объектами.

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

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

Классы

Тип class (класс) объсктно-ориенггированных языков программирования C++/CLI, C# и Java описывает множество однотипных объектов с одними и теми же данными и функциями, то есть обладающих общим состоянием и поведением.

Те данные и функции класса, которые предназначены только для собственного использования внутри объектов данного класса, помечаются доступом private (закрытый). Они не доступны извне объекта.

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

Обычно большинство данных, функций и операций скрыто {private) внутри класса и не доступно вне объекта и лишь только те из них, без которых невозможно управление объектом извне, открыты {public). В идеале, желательно описать в классе открытыми только функции, достаточные и необходимые для управления поведением его объектов и обращения к требуемым данным, а всё остальное – скрыть.

Эти открытые функции образуют интерфейс объектов, создаваемых из класса. В дальнейшем объекты взаимодействуют только через их интерфейсы, поскольку только интерфейсные функции доступны вне объекта.

В примере 2.2.1 приведено описание простого класса CBall, которым представлена такая сущность как летающий шар, ограниченная только координатами полёта и простейшим перемещением: каждый раз при вызове функции Move() координата х увеличивается на 5, а координата у – на 10 пикселей. Класс CBall описан на языках C++/CLI, C# и Java.