- •2. Основные понятия объектно-ориентированного программирования 7
- •3. Управляемый и неуправляемый код и данные 17
- •3.3 Управляемый и неуправляемый код и данные 17
- •5. Классы 38
- •6. Наследование классов и интерфейсы 49
- •7. Программа ввода/вывода информации 62
- •8. Управляемые данные и их использование 76
- •Предисловие
- •2.Основные понятия объектно-ориентированного программирования
- •2.1 Объекты
- •2.2Классы
- •Пример 2.2.2. Создание и использование объектов.
- •2.3Объекты, классы и uml
- •2.4Основные свойства объектно-ориентированного программирования
- •Пример 2.4.1. Класс cColBall, наследуемый класс cBall.
- •Пример 2.4.2. Использование функций объектов.
- •2.5Библиотеки классов
- •3.Управляемый и неуправляемый код и данные
- •3.1Виртуальная машина языка Java
- •3.2Общеязыковая среда выполнения clr платформы .Net
- •3.3Управляемый и неуправляемый код и данные
- •3.4Сборщик мусора
- •3.5Ссылочные типы и типы-значения
- •3.6Метаданные
- •3.7Библиотеки, пакеты и пространства имён
- •4.1О типах данных
- •4.2Консольный ввод и вывод
- •Void main (void)
- •Import java.Io.*;
- •Int X; // Целочисленная переменная X
- •4.3Объявление переменных
- •4.4Операторы динамического распределения памяти new и delete
- •Int X; // Выделить память в стеке
- •Пример 4.4.2. Использование оператора new в языках Java и c#.
- •Import java.Io.*;
- •Int X; // Выделить память в стеке для переменной
- •Int X; // Выделить память в стеке для переменной
- •4.5 Массивы
- •Пример 4.5.2. Описание одномерных массивов на изыках Java и c#.
- •Пример 4.5.4. Создание массивов объектов на языке Java.
- •Import java.Io.*;
- •4.6Объявления структур и перечислений
- •4.7Ссылки
- •Пример 4.7.1. Использование ссылочной переменной.
- •Void main()
- •4.8Перегрузка функций
- •Пример 4.8.1. Перегруженные функции swap (int &, int &) и swap (bool &,bool &).
- •Void swap (int &a, int &b) // Целочисленные параметры
- •Void swap (bool &a, bool &b) // Булевские параметры
- •4.9Объявление функций и передача аргументов по умолчанию
- •Void swap (int &, int &);
- •Void swap (char 8t, char &);
- •Пример 4.9.1. Задание значений параметров функции по умолчанию.
- •Void main ( )
- •5.Классы
- •5.1Определение класса
- •Пример 5.1.1. Описание класса и создание его объектов.
- •Int X; // Закрытая переменная X
- •Void Show ( ) // Открытая функция
- •Int X; // Закрытая (по умолчанию) переменная X
- •Void Show ( ) // Открытая функция
- •Пример 5.2.1. Описание функций вне класса.
- •Int X; //Закрытая переменная х
- •Void Set(int m,char n); // 0бъявление функции Set
- •Void Show (); // Объявление функции Show()
- •5.3Некоторые замечания о классах
- •Пример 5.3.1. Области видимости.
- •Int GetK() {return k;} // Функция GetK() видна в файле, классе а и в
- •Int n; // Переменная n закрыта и видна только в классе а
- •Int GetM () {return n;} // Функция GetM() открыта и видна
- •5.4Объекты в объектах
- •Пример 5.4.1. Объект содержит объект другого класса.
- •Void Show ()
- •Void Show ()
- •5.5Специальный вид функций класса - конструкторы и деструкторы
- •Пример 5.5.1. Перегруженные конструкторы.
- •Int GetX() {return X;} // Возвратить значение закрытой переменной
- •Void ShowX () // Вывести значение переменной
- •5.6Статические функции класса
- •Пример 5.6.1. Статические функции.
- •Void f() {Console::WriteLine("f()");} // Обычная функция
- •Int main() // Главная статическая функция Main()
- •6.Наследование классов и интерфейсы
- •6.1Об интерфейсах
- •Пример 6.2.1. Программа, использующая порождение public.
- •Void Show ()
- •Void Show()
- •Int main() // Главная статическая функция
- •6.4Использование конструктора базового класса
- •Java и j#
- •Java и j#
- •Пример 6.4.1. Выполнение конструкторов.
- •Int X; // Закрытая переменная X
- •Int Get() {return X;} // Получить значение X
- •Int main() // Главная статическая функция main()
- •6.5Сокрытые переменные, функции и их использование
- •Пример 6.5.1. Сокрытые переменные и функции.
- •6.6Интерфейсы
- •6.6.1Определение интерфейса
- •Interface class имя-интерф [ : public имя-базов-интерф
- •Interface имя-интерф [ : имя-базов-интерф [, имя-базов-интерф ] ... ]
- •Interface имя-интерф [ extends имя-базов-интерф
- •Interface Ipe // Интерфейс, объявляющий свойство p и функцию Hallo
- •Int p {set; get;} //Объявить свойство
- •Void Hallo(); // Объявить функцию
- •6.6.2Базовые интерфейсы
- •6.7 Упаковка и распаковка типов данных
- •Int main() // Главная статическая функция main()
- •7.Программа ввода/вывода информации
- •7.1Постановка задачи
- •Диаграмма вариантов использования
- •7.2 Диаграмма классов
- •7.3Диаграмма последовательности
- •7.4Диаграмма видов деятельности
- •Пример 7.5.1. Реализация класса cComputer.
- •Пример 7.5.2. Реализация класса cShop.
- •Пример 7.5.3. Реализация класса cData.
- •Void main()
- •Пример 7.5.4. Реализация Inf-приложения.
- •Void main()
- •7.6Реализация Inf-приложения иа языке c# Пример 7.6.1. Реализация Inf-приложения иа языке c#.
- •Int cost; // Стоимость компьютера
- •Int year; // Год изготовления
- •Inf.Enter();
- •Inf.Enter();
- •Inf.Show();
- •8.Управляемые данные и их использование
- •Void set(тип value)
- •Пример 8.1.2. Свойства в Java.
- •Import java.Io.*;
- •Пример 8.2.1. Создание и использование делегата.
- •Void main() // Главная функция программы
- •Пример 8.2.2. Использование делегата как параметра функции.
- •Void r(void) {Console::WriteLine ("r");}
- •Void main () // Главная функция программы
- •Void имя-функции ( void );
- •Пример 8.3.1. Событие и делегат.
- •Void main ()
- •Vold имя-функции-активизации()
- •Пример 8.3.2. Использование события.
- •Void GenerateEv() // Функция-генератор события
- •Void main()
- •Void GenerateEv (String л str) // Функция- генератор события
- •Void main ( )
- •06BeKTfirst клaccaUseEvпoлyчилcoбытиe one
- •Interface iEv
- •IE,HandlerEv (); // Выполнить обработчик
- •Void GenerateEv ( ) // Сгенерировать событие
- •Void main (void)
- •V{ oid FireConnectEvent (object sender, SourceEventArgs e)
- •Void FireConnectEvent (object sender, EventArgs args)
- •8.4. Уведомления и события в Java
- •8.4.1. Уведомления в Java
- •Void notifyObservers () - уведомить всех обозревателей данного наблюдаемого
- •Void notifyObservers (Object obj) - уведомить всех обозревателей данного на-
- •Void update(Observable observable. Object obj) - эта функция данного объекта
- •Import java.Util.*;
- •II Два наблюдателя и один наблюдаемый объект
- •Importjava.Util.*;
- •Importjava.Utll,*;
- •Importjava.Util.*;
- •Int num; // Номер уведомляющего объекта
- •8.4.2. События в Java
- •Import java.Utii.*;
- •Void DatePerformed (DataDate dd); // Обработчик
- •Int n; // Номер объекта-приёмника
- •Int num; // Номер объекта приёмника
- •Import cJHappenListerner.*;
- •Importjava.Uti).*;
- •Void performedHappen (HappenData hD);
- •Import cJHappenListerner.*; | | Импортировать библиотеку
- •9. Потоки и синхронизация их выполнения
- •9.1. Процессы
- •9.3. Потоки в Java
- •Int num; // Номер потокового объекта
- •2. Поскольку объявленному в классе cThread потоковому объекту thr типа
- •9.4. Потоковый объект, выдающий событие
- •If (lllfe) // Если потоковый объект не функционирует,
- •ImportJava,util.*;
- •If (!life) // Если потоковый объект не функционирует,
- •9.5. Поток получил событие из объекта
- •If (!life)
- •If (received)
- •Importjava.Utll.*;
- •If (lllfe)
- •If (received)
- •9.6. Синхронизация выполнения потоков
- •9.6.1. Операторы lock и synchronized
- •Int num; // Номер объекта
- •9.6.2. Связи между потоками
- •9.6.2.1. Связи меяеду потоками в Java
- •If(waiting)
- •9.6.2.2. Связи между потоками в c#
- •If (I moving)
- •9.6.2.1.1 Наязыке Java, отличаясьтолько применением функций монитора
- •10. Библиотека .Net Framework и библиотеки
- •10.1. Приложение
- •10.2. Классы, объекты и элементы приложения
- •Visual Studio .Net как библиотеки .Net Framework, так и пакетов языка Java
- •10.3. Простейшие приложения
- •Import java.Awt.*;
- •Void main ( )
- •10.3.1.1. Оказывается, класс Form сам наследует множество других классов,
- •10.4. Сообщения Windows, события и делегаты
- •X0.4.1. Обработка событий мыши на языке c#
- •Void OurMouseDown (object sender, MouseEventArgs args);
- •Vold maln ()
- •10.4.3. Обработка событий мыши на языке Java с использо-
- •10.4.4. Связь события с несколькими объектами на языке c#
- •10.5. Ещё раз о событиях и уведомлении в языке Java
- •10.5.1. Обработка событий элементов интерфейса пользовате-
- •ItemListener, KeyListener, MouseListener, MouseMotionListener, TextListener
- •10.5.2. Обработка событий мыши на языке Java, используя
- •Importjava.Awt.Event.*;
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •10.5.3. Обработка событий мыши на языке Java, используя классы адап-
- •Importjava.Awt.*;
- •Importjava.Awt.Event.*;
- •Importjava.Awt.*;
- •Importjava.Awt.Event.*;
- •10.5.4. Обработка событий мыши на языке Java, используя внутренние
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •10.5.5. Обработка события закрытия окна
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •10.6. Графика
- •10.6.1. Графические объекты
- •15, 15, 60, 70); // Нарисовать эллипс
- •Vold maln ()
- •10.7. Событие Paint и его обработчик
- •Int len; // Текущая длина массива points
- •Void OurMouseDown (object sender, MouseEventArgs arg)
- •Invalidate ( ); // Перерисовать
- •Int len; // Текущая длина массива points
- •Import java.Awt.Event.*;
- •10.8. Управляющие элементы
- •1 «Button j 1
- •Import java.Awt,event.*;
- •Int n; // Индекс цвета
- •10.8.4,10.8.5 И 10.8.6, а также программа, поэтапно разрабатываемая в разде-
- •Invalidate ();
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •Importjava.Util.*;
- •10.9. Дочерние окна
- •Int n; // Индекс массива colors
- •IiTipOrt jav'a.Avvt. •)
- •Import java.Awt.Event.*;
- •Int n; // Индекс цвета
- •Virtual void OnPaint (PaintEventArgs л arg) override // Перерисовать область
- •10.10.3, В котором вызываются две функции.
- •Importjava.Awt.*;
- •Importjava.Awt.Event.*;
- •It); // Подписать обработчик
- •Void main ( )
- •11.1. Программа с точки зрения пользователя
- •11.2. Объектное представление программы
- •11.3. События, потоки и их синхронизация
- •11.4. Поэтапная разработка программы
- •11.4.1. Первый этап. Разработка класса Warehouse
- •4Cxrt()
- •Int partLoad; // Выгружаемая или загружаемая порция
- •If(full) return false; // Полный грузовик не загружать
- •Invalidate ();
- •Importjava.Awt.*;
- •Importjava,utll.*;
- •Void notifyObs (WarehouseEventArgs arg)
- •Int partLoad; // Получаемая или помещаемая порция груза
- •If (full) return false;
- •If(full) return false; // Полный грузовик не загружать
- •Void Change ( )
- •Invalidate ();
- •Importjava.Awt.*;
- •Importjava.Util.*;
- •Import cjWarehouse.*
- •11.4.2. Второй этап. Разработка классов ContrlRegion и Lorry
- •11.4.2.1, А сам класс представлен в примере 11.4.2.1. Класс ContrlRegion язы-
- •Importjava.Awt.Event.*;
- •Void Work ( ) // Выполнить работу
- •Int number;
- •Int number;
- •Int timePeriod;
- •Int y; // Координата y пути грузовика
- •Invalidate ();
- •11.4.3. Третий этап. Разработка приложения csLorryAndWarehouse
- •4IorryAndWa rho uses()
- •4Main()
- •Int y; // Координата y пути грузовика
- •Invalidate ( );
- •If(lorry.GetFull())
- •If(lorry.GetLeftRight()) g.SetColor(Color.Red);
- •Int numLorry; // Номер грузовика
- •Void But_Run (Object Ло, EventArgs ле)
- •Void main ( )
- •11.4.4. Четвертый этап. Удаление ресурса
- •Int number;
- •If(!lorry.Running)lorry.Run ( );
- •12. Зачетные задачи
- •12.1. Задание 1
- •Importjava.Awt.*;
- •Import Java.Awt.Event.*;
- •Importjava.Util.*;
- •12.2. Задание 2
- •Importjava.Awt.*;
- •Importjava.Awt.Event,*;
- •Importjava.Util.*;
- •Invalidate ( );
- •12.3. Задание 3
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •Importjava.Util.*;
- •If(bool) Start ();
- •If(lrunnlng)
- •Void BallFunc ()
- •Void ThrFunc ( )
- •Vold OnButAdd (object obj, EventArgs arg)
- •Void HandlerEv ( )
- •Invalidate ( );
- •12.4. Задание 4
- •If(reg.R.Contains(p) && !inRect)
- •If(!reg.R,Contains(p) && lnRect)
- •Void OnButAdd (object obj, EventArgs arg)
- •Void HandlerEv ( )
- •Invalidate ();
- •Importjava.Awt.*;
- •Importjava.Awt.Event.*;
- •Importjava.Utll.*;
- •Int w, int h, Color c, Wind wind)
- •If(reg.R.Contains(p) && !lnRect)
- •If(!reg.R.Contains(p) && inRect)
- •If(d.GetDel())
- •13. Ещё о важном в объектно-ориентирован-
- •13.1. Виртуальные функции
- •13.1.1. Преобразование типов
- •Void f ( ) {cout « "ca:: f" « endl;}
- •Void main ( )
- •Void f ()
- •Void main ( )
- •Vold f ( )
- •Vold Do (ca* pCa)
- •Void main ( )
- •13.1.2, Виртуальные функции
- •Virtual void f ( ) {Console::WriteLine ("a:: f");}
- •Void f ( ) {Console::WriteLine ("b:: f");}
- •Void f ( ) {Console::WrlteLlne ("c:: f");}
- •Vold f ( ) {Console::WrlteLlne("b:: f");}
- •Vold Do (a* pA)
- •Void main ()
- •13.1.3. Виртуальные функции, используемые в книге
- •13.2. Абстрактные классы и функции
- •13.2.1. Абстрактные функции
- •13.2.2. Абстрактные классы
- •Void f ( ) {Console::WriteLine ("b:: f");}
- •Vold f ( ) {Console::WriteLine ("d:: f");}
- •Vold main ( )
- •13.2. Нововведения в языке c#
- •13.2.1.Делегаты и события
- •Iorry.Run ( );
- •13.3.2. Статические классы
- •Int partLoad; // Выгружаемая или загружаемая порция
- •If(!full)
- •Invalidate ( );
- •Int number;
- •Int y; // Координата y пути грузовика
- •Iorry.Stop ();
- •If(llorry.Running)lorry.Run ( );
- •Invalidate ( );
- •1) Создать новый проект:
- •Value 28, 30
- •Value type 34
- •Visual Studio .Net и Edipse.
- •420111, Казань, Дзержинского, 3. Тел.: 292-24-76.
Серия «Современная прикладная математика и информатика»
В. И. Медведев
Особенности
объектно-ориентированного
программирования на
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.
