- •2. Основные понятия объектно-ориентированного программирования 7
- •3. Управляемый и неуправляемый код и данные 17
- •3.3 Управляемый и неуправляемый код и данные 17
- •5. Классы 38
- •6. Наследование классов и интерфейсы 49
- •7. Программа ввода/вывода информации 62
- •8. Управляемые данные и их использование 76
- •Предисловие
- •2.1 Объекты
- •2.Основные понятия объектно-ориентированного программирования
- •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Интерфейсы
- •Interface class имя-интерф [ : public имя-базов-интерф
- •Interface имя-интерф [ : имя-базов-интерф [, имя-базов-интерф ] ... ]
- •Interface имя-интерф [ extends имя-базов-интерф
- •Interface Ipe // Интерфейс, объявляющий свойство p и функцию Hallo
- •Int p {set; get;} //Объявить свойство
- •Void Hallo(); // Объявить функцию
- •6.6.1Определение интерфейса
- •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.
Void GenerateEv ( ) // Сгенерировать событие
{
Console:.:WriteUne ("Объект класса А послал событие FromA ");
pEvAB ("FromA"); // Сгенерировать событие
}
void HandlerEv (String ^str) // Обработать событие
{
Console::WriteLine ("Объект класса А получил событие {0> ", str);
>
>;
ref class В // Класс объекта-источника и объекта-приёмника
{
public:
event delEv ^pEvBC; // Дескриптор pEvBC на событие
vold HandlerEv (String ^str) // Обработать событие
{
Console::WriteLine ("Объект класса В получил событие {0> ", str);
Console::WrlteLlne ("Объект класса В послал событие FromB");
pEvBC ("FromB"); // Сгенерировать событие
>
>;
ref class С // Класс объекта-источника и объекта-приёмника
{
public:
event delEv ^pEvCA; // Дескриптор pEvCA события
void HandlerEv (String ^str) // Обработать событие
{
Console::WriteLine ("Объект класса С получил событие {0} ", str);
Console::WriteLine ("Объект класса С послал событие FromC");
pEvCA ("FromC"); // Сгенерировать событие >
>;
Void main (void)
{
А ^pA= gcnew А; // Создать объект класса А, генерирующий событие pEvAB
В ^pB= gcnew В; // Создать объект класса В, генерирующий событие pEvBC
С ^pC= gcnew С; // Создать объект класса С, генерирующий событие pEvCA
pA -> pEvAB += gcnew delEv (pB, &B::HandlerEv); // Инициализировать pEvAB
pB -> pEvBC += gcnew delEv (pC, &C::HandlerEv); // Инициализировать pEvBC
pC -> pEvCA += gcnew delEv (pA, &A::HandlerEv); // Инициализировать pEvCA
pA -> GenerateEv ( ); // Сгенерировать событие из объекта pA
>
/ *
Result:
Объект
Объект
Объект
Объект
Объект
Объект
*/
////////////////////
/ / C #
using System;
delegate void delEv (string st); // Делегат события
{c lass А // Класс объекта, посылающего событие объекту класса В
public event delEv evAB; // Ссылка на событие
public void GenerateEv ( ) // Сгенерировать событие
{
if (evAB 1= null)
{
Console.WriteLine ("Объект класса А послал событие FromA");
evAB ("FromA"); // Послать событие
>
>
public void HandlerEv (string st) // Обработать поступившее событие
{
Console.WriteLine ("Объект класса А получил событие " + st);
> >
класса А послал событие FromA
класса В получил событие FromA
класса В послал событие FromB
класса С получил событие FromB
класса С послал событие FromC
класса А получил событие FromC
c|ass В // Класс объекта, посылающего событие объекту класса С
public event delEv evBC; // Указатель события
public void HandlerEv (string str) // Обработать поступившее событие
{
Console.WriteLine ("Объект класса В получил событие " + str);
if (evBC 1= null)
{
Console.WriteLine ("Объект класса В послал событие FromB");
evBC ("FromB"); // Послать событие
>
>
>
class С // Класс объекта, посылающего событие объекту класса А
<
public event delEv evCA; // Указатель события
public void HandierEv (string str) // Обработать поступившее событие
{
Console.WriteLine ("Объект класса С получил событие " + str);
if (evCA 1= null)
{
Console.WriteLine ("Объект класса С послал событие FromC");
evCA ("FromC"); // Послать событие
>
>
>
class TestEv
{
static void Main ( )
{
А a= new А ( );
В b= new В ();
С c= new С ( );
a.evAB += new delEv (b.HandlerEv);
b.evBC += new delEv (c.HandlerEv);
c.evCA += new delEv (a.HandlerEv);
a.GenerateEv ( );
>
>
Программа на языке C++/CLI и языке C# содержит класс А, содержа-
щий функцию GenerateEv(), только генерирующую событие evAB, и функ-
цию HandlerEv(), только обрабатывающую поступившее событие.
Другие два класса В и С идентичны и содержат только одну функцию
HandlerEv(), которая не только обрабатывает поступившее событие, но и ге-
нерирует новое событие. Эта функция обеспечивает событийную связь меж-
ду двумя объектами: объект получает событие от одного объекта и после
этого отправляет собственное событие к другому объекту.
Главная функция Main() или main() вначале создаёт три объекта клас-
сов А, В и С. Затем устанавливается событийная связь между этими объекта-
// Создать объект а класса А
// Создать объект b класса В
|| Создать объект с класса С
// Направить событие отД к В
П Направить событие от В к С
// Направить событие от С к А
// Сгенерировать событие
// объекта-источника а
ми. Посредством делегата delEv на событие объекта класса А подписывает-
ся обработчик HandlerEv() объекта класса В, на событие объекта класса В
подписывается обработчик HandlerEv() объекта класса С и на событие объек-
та класса А подписывается обработчик HandlerEv() объекта класса С. Так
установлена цепочка последовательности передачи событий между тремя
объектами. Когда эта связь установлена, выполняется функция GcnerateEv()
первого объекта цепочки. Результат передачи событий между объектами ви-
ден на консоли.
Можно для каждой потенциально возможной ситуации предложить со-
бытие со своим именем. Тогда при решении сложных задач придётся иметь
дело с очень большим числом событий и окажется громоздкой реализация
связи источников с приёмниками.
Для уменьшения числа событий достаточно выделить основные собы-
тия и связать с каждым из них данные, конкретизирующие это событие при-
менительно к конкретным ситуациям. При этом желательно уплотнить пере-
даваемые данные события, поместив их в один объект. Короче говоря, хоро-
шо бы унифицировать событие, сделав связь с ним единообразной и понят-
ной. То есть придерживаться определённых правил при работе с событиями,
которые не только бы упорядочили разработку событий, но и существенно
облегчили использование событий, разработанных другими программистами.
Особенно это важно при использовании общеупотребительных событий, на-
пример, событий интерфейсных элементов типа Button (кнопка), ListBox
(список) и других.
При программировании событий рекомендуется:
- в имени обработчика события использовать слово Handler,
- обработчики событий должны иметь возвращаемое значение void,
- делегат события и, конечно, обработчик должен иметь следующий
список параметров:
(object sender, EventArgs args) // C#
(Object ^sender, EventArgs ^args) // C++/CLI
где sender (^sender) - ссылка (дескриптор) на объект-источник события,
args (^args) - ссылка (дескриптор) на объект класса, порождённого из
класса EventArgs, который содержит открытые (public) данные или свойства,
связанные с событием.
Класс EventArgs наследует класс Object и содержит единственное свой-
ство Empty, значение false которого указывает о наличии данных, а true - об
их отсутствии.
Пример 8.3.5 показывают создание и применение событий с массивом
строк на основе высказанных рекомендаций.
Пример 8.3.5. Событие с данными.
///////////////
/ / C #
using System;
// Класс SourceBventArgs для данных типа string события из класса Source
public class SourceEventArgs: EventArgs
{
public readonly string [ ] s;
public SourceEventArgs (string [ ] s)
{
this.s= s;
>
>
П Класс Source - источник события с объектом типа SourceEventArgs
public class Source
{
public delegate void delEvSourceHandler (object sender,
SourceEventArgs se);
public event delEvSourceHandler evSource;
public vold FireSourceEvent (string [ ] s)
{
SourceEventArgs sourceArgs = new SourceEventArgs (s);
evSource (this, sourceArgs);
>
>
// Класс Sink с обработчиком события объекта source класса Source
class Sink
{
public Sink (Source source)
{
source.evSource += new Source.delEvSourceHandler
(FireConnectEvent);
>
