Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МВ до ЛР КТтаП (ч.2) 1-1 ДрукУМК.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
681.98 Кб
Скачать
  1. Номер, тема і мета лабораторної роботи.

  2. Стислі теоретичні відомості.

  3. Постановка задачі.

  4. Текст програми відповідно до завдання з коментарями та результатами.

  5. Висновки.

4. Контрольні запитання

  1. Масив.

  2. Об’ява та ініціалізація двовимірного масиву.

  3. Введення/виведення масиву на форму програми.

  4. Метод Focus.

Лабораторна робота № 3 Створення ієрархії об’єктів

Мета роботи: отримати поняття про ієрархію об’єктів, отримати навички практичного застосування принципів об’єктно-орієнтованого програмування.

1. Постановка задачі

Створимо новий проект, в якому на формі розмістимо компоненти приблизно так, як показано у вікні працюючої програми на рис.3.1. В завданні треба створити масив різних об’єктів однієї ієрархії класів і при натисненні кнопки "Загальна інформація" показати характеристики виділеного в списку об’єкта. Характеристики об’єктів є можливість занести у відповідну таблицю. В цій програмі на вершині їєрархії приміщень знаходиться абстрактний клас.

2. Поради до написання програми

В програмуванні ієрархію класів для моделювання ряду об’єктів від простих до складних починають, як правило, з базового абстрактного класу, який описує їх фундаментальні загальні елементи. Ці елементи носять настільки загальний характер, що такий клас на може моделювати реальні об’єкти і тому створення екземплярів класу стає неможливим або, в усякому разі, недоцільним. Ієрархію створюють класи нащадки, які конкретизують і доповнюють загальні елементи первинного абстрактного класу відповідно до моделей певних видів реальних об’єктів. Наприклад, ієрархію класів Koridor, Kimnata, Kuhnia можна створити на основі абстрактного класу SizeObject, який має три поля для відображення довжини, ширини і висоти будь-якого реального об’єкта відповідної форми.

Рис.3.1. Вікно програми для ілюстрації принципів об’єктно-орієнтованого програмування.

Для опису абстрактного класу треба специфікатор заголовка доповнити словом abstract. Опис абстрактного класу SizeObject з закритими полями len, wid, heig і з відповідними відкритими властивостями Len, Wid, Heig, а також абстрактним методом Info(), можна дати в такій редакції:

public abstract class SizeObject : object

{

private int len;

private int wid;

private int hei;

public int Len

{

get

{

return len;

}

set

{

if ((value >= 1) && (value <= 7)) len = value;

}

}

public int Wid

{

get

{

return wid;

}

set

{

if ((value >= 1) && (value <= 6)) wid = value;

}

}

public int Hei

{

get

{

return hei;

}

set

{

if ((value >= 2) && (value <= 4)) hei = value;

}

}

//абстрактний клас не може мати конструктор

public abstract string Info();

}

Тепер створимо дочірній клас Koridor з додатковим полем dveri і перевизначеним методом Info():

public class Koridor : SizeObject

{

private int dveri;

public int Dveri

{

get

{

return dveri;

}

set

{

if ((value >= 1) && (value <= 5)) dveri = value;

}

}

public Koridor() //пустий конструктор без параметрів

{

}

public Koridor(int len, int wid, int hei, int dveri)

{ //конструктор з праметрами

Len = len;

Wid = wid;

Hei = hei;

this.dveri = dveri;

}

override public string Info()

{//перевизначений віртуальний метод

string inform = (string.Format

("Коридор: довжина {0},ширина {1},висота {2},дверей {3}\n",

Len, Wid, Hei, Dveri));

return inform;

}

virtual public void OnRemEvent(object sender, EventArgs e)

{ //віртуальний метод обробника події

MessageBox.Show

("Клас Koridor повідомлення про подію одержав і обробив!");

}

}

Конструктор без параметрів і віртуальний метод обробника події потрібні будуть для наступних завдань. В першому завданні їх можна опустити.

Наступний клас ієрархії Kimnata з додатковим полем vikna і перевизначеним методом Info() виглядатиме так:

public class Kimnata : Koridor

{

private int vikna;

public int Vikna

{

get

{

return vikna;

}

set

{

if ((value >= 1) && (value <= 5)) vikna = value;

}

}

public Kimnata()

{

}

public Kimnata(int len, int wid, int hei, int dveri, int vikna)

: base(len, wid, hei, dveri)

{

this.vikna = vikna;

}

override public string Info()

{

string inform = (string.Format

(" Кімната: довжина {0}, ширина {1}, висота {2}, " +

"дверей {3}, вікон {4} \n",

Len, Wid, Hei, Dveri, Vikna));

return inform;

}

override public void OnRemEvent(object sender, EventArgs e)

{

MessageBox.Show

("Клас Kimnata повідомлення про подію одержав і обробив!");

}

}

Закінчимо ієрархію класом Kuhnia з додатковим полем plita і перевизначеним методом Info() таким текстом:

public class Kuhnia : Kimnata

{

public string plita;

public Kuhnia()

{

}

public Kuhnia(int len, int wid, int hei,

int dveri, int vikna, string plita)

: base(len, wid, hei, dveri, vikna)

{

this.plita = plita;

}

override public string Info()

{

string inform =

(string.Format(" Кухня: довжина {0}, ширина {1}, " +

"висота {2}, дверей {3}, вікон {4}, плита {5} \n",

Len, Wid, Hei, Dveri, Vikna, plita));

return inform;

}

override public void OnRemEvent(object sender, EventArgs e)

{

MessageBox.Show("Клас Kuhnia повідомлення про подію одержав і обробив!");

}

}

В обробниках подій OnRemEvent в усіх класах оператори MessageBox.Show з відповідними повідомленнями виконують методично-навчальну функцію, тому після тестування програми їх можна опустити, помістивши у коментар. Для того, щоб не створювати проблем з не вибором рядків у відповідних списках, конструктор класу Form1 запишіть в такій редакції:

public Form1()

{

InitializeComponent();

listBox1.SelectedIndex = 0;

comboBox1.SelectedIndex = 1;

}

Тепер напишемо метод CommonInfo() для виведення інформації про розміри об’єктів створених класів в такій редакції:

public void CommonInfo() //загальна інформація

{

const int n = 3;

Koridor[] Mas = new Koridor[n];

int[,] A = new int[3,5]; //без індексатора

string st0="";

for (int i = 0; i < 3; i++)

{

st0 = textBox1.Lines[i];

string[] words = st0.Split(' ');

for (int j = 0; j < 5; j++ )

A[i, j] = Convert.ToInt32(words[j]);

}

string p = "електрична";

Mas[0] = new Koridor(A[0,0], A[0,1], A[0,2], A[0,3]);

Mas[1] = new Kimnata(A[1,0], A[1,1], A[1,2], A[1,3], A[1,4]);

Mas[2] = new Kuhnia(A[2,0], A[2,1], A[2,2], A[2,3], A[2,4], p);

string st1 = "";

switch (listBox1.SelectedIndex)

{

case 0: st1 = Mas[0].Info(); break;

case 1: st1 = Mas[1].Info(); break;

case 2: st1 = Mas[2].Info(); break;

case 3: foreach (Koridor X in Mas)

textBox2.AppendText(X.Info()); break;

}

textBox2.AppendText(st1);

}

В приведеному методі CommonInfo() створений масив із трьох елементів типу Koridor. При цьому першому елементу присвоєний об’єкт типу Koridor, а другому і третьому елементам присвоєні об’єкти відповідно типу Kimnata і Kuhnia. Розміри об’єктів занесені в двовимірний масив А цілих чисел. Ці розміри використані при ініціалізації об’єктів відповідними конструкторами з параметрами. Обробник buttonInfo_Click події натиснення кнопки з надписом "Загальна інформація" запускає методі CommonInfo() на виконання:

private void buttonInfo_Click(object sender, EventArgs e)

{

CommonInfo();

}

3. Зміст звіту