- •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.
Int len; // Текущая длина массива points
public CLine( ) // Конструктор
{
// Привязать к событию MouseDown функцию OurMouseDown
MouseDown += new MouseEventHandler (OurMouseDown);
Text= "Line"; // Заголовок прикладного окна
points= new Point [20]; // Создать массив polnts в куче
len= 0; // Инициализировать len >
// Перерисовать область клиента окна
protected override void OnPaint (PaintEventArgs arg)
{
base.OnPaint (arg);
for (int i=0; i < len-1; i++) // Перебрать массив точек
arg.Graphics.DrawLine // Нарисовать отрезок линии
(new Pen (Color.Blue), points[i], points[i+l]);
// Обработать событие MouseDown мыши
Void OurMouseDown (object sender, MouseEventArgs arg)
{
// Реагировать только на левую клавишу мыши
if (arg.Button == MouseButtons.Right) return;
If (len < 20) // Если есть место в массиве polnts, то
{ // поместить в массив точку
points[len].X= arg.X; // Координата X носика курсора мыши
points[len].Y= arg.Y; // Координата Y носика курсора мыши
len++;
>
Invalidate ( ); // Перерисовать
static void Main ( ) // Главная функция
{
Application.Run (new CLine ( )); // Выполнить приложение
шишшшшш
// C + + / C L I
*inciude "stdafx,h"
#using <System.Drawing,dll>
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::Drawing;
using namespace System::Wlndows::Forms;
ref class CLine : Form // Класс прикладного окна
/
array<Point^> ^points; // Массив точек носика курсора мыши
Int len; // Текущая длина массива points
public:
CLine() // Конструктор
{
// Привязать к событию MouseDown функцию OurMouseDown
MouseDown += gcnew MouseEventHandler (this,
&CLine::OurMouseDown);
Text= "Line"; // Заголовок прикладного окна
points= gcnew array<Point^> (20); // Создать массив points в куче
len= 0; // Инициализировать len >
protected:
// Перерисовать область клиента окна
virtual void OnPaint (PaintEventArgs ^arg) override
{
Form: :OnPaint (arg);
for (int i=0; i < len-1; i++) // Перебрать массив точек
arg->Graphics->DrawLine // Нарисовать отрезок линии
(gcnew Pen (Color::Blue), *points[i], *points[i+l]);
}
// Обработать событие MouseDown мыши
void OurMouseDown (Object ^sender, MouseEventArgs ^arg)
{
if (len < 20) // Если есть место в массиве points, то
{
polnts[len]=gcnew Point (arg->X, arg->Y); // поместить в массив
len++; >
Invalidate ( ); // Перерисовать
>
>;
void main ( )
{
Application:: Run (gcnew CLine ( ));
}
///////////////
// Java и J#
import java.awt.*;
import java.awt.event,*;
class CLine extends Frame // Класс прикладного окна
{
Point [ ] points; // Массив точек носика курсора мыш»
int len; // Текущая длина массива polnts
public CUne() // Конструктор
{
setTitle ("Llne"); // Установить заголовок прикладного <
setSize (400, 200); // Установить размер окна
//this.setBackground (Color.lightGray);
points= new Point [20]; // Создать массив po/nts точек в куче
len= 0; // Инициализировать len
// Реализовать обработчик события мыши, применив
// внутренний анонимный класс
this.addMouseListener (new MouseAdapter ()
{
public void mousePressed (MouseEvent mE)
{
|| Реагировать только на левую клавишу мыши
if((mE.getModifiers()&Event.META_MASK)>0) return;
if (len < 20) // Если есть место в массиве points
{
points[len]= mE.getPoint (); // Координаты
U носика курсора мыши
leri++;
У
repaint ( );
>
»;
thls.addWindowListener (new OurWindowAdapter());
>
// Перерисовать область клиента окна
public void paint (Graphics g)
{
g.setColor (Color.blue);
for (int i=0; i < points.length-l; I++) // Перебрать массив точек
{
g.drawLine( // Нарисовать отрезок линии
points[i].x, points[().y ,polnt5[i+l].x, points[i+l].y);
У
>
public static void main ( ) // Главная функция
{
CLIne line= new CLIne ( );
line.show ( ); >
>
// Класс а д а п т е р а окна
class OurWindowAdapter extends WindowAdapter
{
public void windowClosing (WindowEvent wE)
{
System.exit (0);
>
>
C#. Класс CLine прикладного окна, порождённый из базового класса Form,
содержит закрытый массив точек points, соответствующих координатам но-
сика мыши нажатых клавиш, и текущую длину ien этого массива.
При создании объекта-окна конструктор инициализирует данные клас-
са CLine, создав массив points из 20 точек в куче и присвоив его текущей дли-
не len значение 0. Кроме этого конструктор подписывает обработчик Our-
MouseDown() на событие MouseDown клавиши мыши и посредством свойст-
ва Text формы определяет заголовок "Line" прикладного окна.
Рассмотрим работу приложения. После запуска приложения появилось
прикладное окно. При создании окна конструктор класса Cline, создав массив
из 20 точек, присвоит длине массива len начальное значение и подпишет об-
работчик OurMouseDown() на событие MouseDown. При появлении окна cre-
нерируется событие Paint и, как следствие, выполнится наш переопределён-
ный обработчик OnPaint(), который в виду нулевого значения переменной len
не рисует ломаную линию в области клиента, Таким образом, при появлении
прикладного окна его область клиента пуста. Приложение ждёт события
MouseDown от нажатия левой клавиши мыши и события от закрытия при-
кладного окна. При нажатии левой клавиши мыши выполнится обработчик
OurMouseDown(). Обработчик OurMouseDown(), воспользовавшись парамет-
ром arg типа MouseEventArgs, извлекает значения координат носика курсора
нажатоЙ клавиши мыши и присваивает их текущему элементу массива points
точек. Затем продвигается индекс len массива. Если индекс len выходит за
границы массива, то пополнения массива новыми точками не будет. Перед
завершением обработчик OurMouseDown() вызывает функцию Invalidate(),
которая генерирует событие Paint, обеспечивая тем самым выполнение
функции OnPaint(). Ломаная линия перерисовывается в окне.
Функция OnPaint() использует графический объект класса Graphics, из-
влекая его из структуры PaintEventArgs с помощью свойства Graphics и обра-
тившись к функции DrawLine() рисования линии. В качестве аргумента
функция DrawLine() использует объект-перо синего цвета.
Ломаная линия рисуется циклически, при этом в каждом цикле рисует-
ся только один отрезок линии синего цвета.
C++/CLI. Программа на языке C++/CLI схожа с программой на языке C#,
поскольку применяются те же классы библиотеки .NET Framework. Обраща-
ет на себя внимание иное описание и использование массива точек. В управ-
ляемом классе CLine применён управляемый массив points, который описан
с применением слова array и является массивом дескрипторов на объекты то-
чек, размещенных в управляемой куче. При нажатии на клавишу мыши обра-
ботчик присваивает очередному дескриптору массива ссылку на созданный в
куче объект точки, содержащей координаты носика мыши. А функция paint()
перерисовки использует через дескриптор эти объекты при рисовании лома-
ной линии.
Обратите внимание, что заголовок функции OnPaint() языка C++/CLI отлича-
ется от заголовка функции OnPaint() языка C#: используется ключевые сло-
во virtual, а слово override стоит в конце заголовка.
Java. Так же, как и в программе на C#, программа на языке Java использует
графический класс Graphics в предопределённой функции перерисовки, ко-
торая называется paint(). Функция рисования линии drawLine() не содержит
объект пера, как в соответствующей функции DrawLine() библиотеки .NET
Framework. Цвет пера устанавливается с помощью свойства setColor(). От-
лично от программы языка C# реализуется и обработка события мыши, в со-
ответствии с одним из вариантов, изложенных в разделе 10.5. Вместо функ-
ции Invalidate() языка C# применена функция repaint(). Эти функции иниции-
руют появление события Paint. Использованию различных классов позволило
их импортирование с помощью
lmportjava.awt.*;
