Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2_OOP_2_sem.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
238 Кб
Скачать
☆

Вбудовані структури

Як вже зазначалося, всі значущі типи мови реалізовані структурами. У бібліотеці FCL є і інші вбудовані структури. Розглянемо як приклад структури Point, POINTF, Size, SIZEF, Rectangle, що знаходяться в просторі імен System.Drawing (при роботі з консольним проектом цей простір потрібно підключати рис 2.1). Дані структури активно використовуються при роботі з графічними об'єктами. Структури Point, POINTF визначають точки на площині. Властивості X і Y дозволяють задавати координати точки, цілочисельні або дійсні. Для структур Size і SIZEF властивості Height і Width задають висоту і ширину. Структури Point і Size дозволяють сформувати прямокутну область – структуру Rectangle. Конструктору прямокутника можна передати як аргументи дві структури: точку, що задає координати лівого верхнього кута прямокутника, і розмір – висоту і ширину прямокутника.

Рисунок 2.1 – Підключення простору імен System.Drawing

Між чотирма структурами визначені взаємні перетворення: точки можна перетворити в розміри і навпаки, складання і віднімання визначене над точками і розмірами, але не над точками, дійсний тип яких різними способами можна привести до цілого. Ряд операцій над цими структурами продемонстрований в наступному прикладі:

public void TestPointAndSize()

{

Point pt1 = new Point(3, 5), pt2 = new Point(7, 10), pt3;

POINTF pt4 = new POINTF(4.55f, 6.75f);

Size sz1 = new Size(10, 20), sz2;

SIZEF sz3 = new SIZEF(10.3f, 20.7f);

pt3 = Point.Round(pt4);

sz2 = new Size(pt1);

Console.WriteLine("pt1: " + pt1);

Console.WriteLine("sz2 = new Size(pt1): " + sz2);

Console.WriteLine("pt4: " + pt4);

Console.WriteLine("pt3 = Point.Round(pt4): " + pt3);

pt1.Offset(5, 7);

Console.WriteLine("pt1.Offset(5,7): " + pt1);

Console.WriteLine("pt2: " + pt2);

pt2 = pt2 + sz2;

Console.WriteLine("pt2= pt2+ sz2: " + pt2);

}//TestPointAndSize

Результати його виконання показані на рис. 2.2.

Рисунок 2.2 – Операції над точками і розмірами

Відзначимо, що метод ToString, визначений для цих структур, видає рядок із значеннями полів в прийнятній для сприйняття формі.

Ще раз про дві семантики привласнення

На закінчення розмови про посилальні і розгорнені типи побудуємо клас CPoint, що є аналогом структури Point. Не приводитимо опис цього класу, сподіваймося, він є достатньо зрозумілим. Обмежимося прикладом, в якому аналогічні дії виконуються над об'єктами, що належать структурі Point і класу CPoint:

public void TestClassAndStructPoint()

{

string s = "Структури: привласнення розгорненого типу!";

Console.WriteLine(s);

Point pt1 = new Point(3, 5), pt2;

pt2 = pt1;

Console.WriteLine("pt1: " + pt1);

Console.WriteLine("pt2 = pt1: " + pt2);

pt1.Offset(5, 7);

Console.WriteLine("pt1.Offset(5,7): " + pt1);

Console.WriteLine("pt2: " + pt2);

s = "Класи: привласнення посилального типу!";

Console.WriteLine(s);

CPoint cpt1 = new CPoint(3, 5), cpt2;

cpt2 = cpt1;

Console.WriteLine("cpt1: " + cpt1);

Console.WriteLine("cpt2=cpt1: " + cpt2);

cpt1.Offset(5, 7);

Console.WriteLine("cpt1.Offset(5,7): " + cpt1);

Console.WriteLine("cpt2: " + cpt2);

}

Результати обчислень показані на рис. 2.3.

Рисунок 2.3 – Дві семантики привласнення

Дії над об'єктами Point і CPoint виконуються аналогічні, а результати виходять різні: в кінці обчислень pt1 і pt2 різні, а cpt1 і cpt2 співпадають. Пояснення цьому зрозуміло: у першому випадку привласнення структур pt2 і pt1 – значуще, а для об'єктів cpt1 і cpt2 – посилальне.