Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.17 Mб
Скачать

Серия «Современная прикладная математика и информатика»

В. И. Медведев

Особенности

объектно-ориентированного

программирования на

C++/CLI, C# и Java

второе издание

Редактор серии — Заслуженный деятель науки и техники PT,

доктор технических наук, профессор B.C. Моисеев

Медведев В.И. Особенности объектно-ориентированного программирования на C++/CLI, C# и Java. 2-е изд., испр. и доп. - Казань: РИЦ «Школа», 2010.-444 c.: ил.

ISBN 978-5-4233-0007-4

Излагаются основные понятия и методика разработки объектно-ориентированных программ на языках C++/CLI, C# и Java (J#).

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

Параллельное изложение схожих основных языковых конструкций позволит лучше выявить не только близость и различие языков C++/CLI, C# и Java, но и лучше понять особенности этих языков.

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

УДК 681.3.06

ББК 32.973.26 - 018

ISBN 978-5-4233-0007-4 © Медведев В. И., 2010

Предисловие 4

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

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

2.1 Объекты 7

2.2 Классы 8

2.3 Объекты, классы и UML 11

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

2.5 Библиотеки классов 16

3. Управляемый и неуправляемый код и данные 17

3.1 Виртуальная машина языка Java 17

3.2 Общеязыковая среда выполнения CLR платформы .NET 17

3.3 Управляемый и неуправляемый код и данные 17

3.4 Сборщик мусора 18

3.5 Ссылочные типы и типы-значения 18

3.6 Метаданные 20

3.7 Библиотеки, пакеты и пространства имён 20

4. Некоторые особенности языков C++/CLI, C# и Java(J#) 21

4.1 О типах данных 21

4.2 Консольный ввод и вывод 22

4.3 Объявление переменных 25

4.4 Операторы динамического распределения памяти new и delete 25

4.5 Массивы 29

4.6 Объявления структур и перечислений 34

4.7 Ссылки 34

4.8 Перегрузка функций 35

4.9 Объявление функций и передача аргументов по умолчанию 36

4.10 Передача аргументов функций в языках C++/CLI и C# 36

5. Классы 38

5.1 Определение класса 38

5.2 Подставляемые функции и оператор привязки языка C++/CLI 41

5.3 Некоторые замечания о классах 41

5.4 Объекты в объектах 43

5.5 Специальный вид функций класса - конструкторы и деструкторы 46

5.6 Статические функции класса 47

6. Наследование классов и интерфейсы 49

6.1 Об интерфейсах 49

6.2 Наследование неуправляемых классов в C++/CLI 50

6.3 Наследование управляемых классов в C++/CLI, C# и Java 52

6.4 Использование конструктора базового класса 53

6.5 Сокрытые переменные, функции и их использование 56

6.6 Интерфейсы 57

6.6.1 Определение интерфейса 58

6.6.2 Базовые интерфейсы 60

6.7 Упаковка и распаковка типов данных 60

7. Программа ввода/вывода информации 62

7.1 Постановка задачи 62

7.2 Диаграмма классов 63

7.3 Диаграмма последовательности 65

7.4 Диаграмма видов деятельности 66

7.5 Поэтапная разработка Inf-приложения на языке C++/CLI 67

7.6 Реализация Inf-приложения иа языке C# 74

8. Управляемые данные и их использование 76

8.1 Свойства в языках C++/CLI, C# и Java 76

8.2 Делегаты языков C++/CLI и C# 78

8.3 События языков C++/CLI и C# 84

Предисловие

Развитие объектно-ориентированного программирования и Internet способствовало появлению новой технологии программирования - .NET технологии, позволяющей на единой платформе разрабатывать компоненты программ на разных языках программирования и обеспечить их совместное выполнение. В рамках .NET технологии предложен новый язык программирования C#, основанный на языке С++ и перенявший из языка Java черты, обеспечивающие создание безопасных программ. С учётом .NET технологии язык С++ расширен новыми возможностями и получил название C++/CLI (Common Language Infrastructure – общая языковая инфраструктура), появился также язык 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, C#, Java и J#, а также библиотека .NET Framework и библиотеки (пакеты) языка Java.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Располагая компилятором языка Java, достаточно для внедрения Java программы на некотором процессоре установить соответствующую этому процессору виртуальную машину JVM.

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

Язык C#, созданный под руководством Андерса Хейльсберга, появился в середине 2000 года как основной язык .NET платформы фирмы Microsoft.

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

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

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

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

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

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

Это позволяет в среде Visual Studio.NET параллельно изучить не только три языка с библиотекой .NET Framework, но и язык J# с родными библиотеками Java. В книге также использована и родная среда Eclipse для языка Java.