Professional Documents
Culture Documents
Лаб4 ООП Звіт
Лаб4 ООП Звіт
Лабораторна робота №4
з дисципліни «Об’єктно-орієнтовне програмування»
«Створення та використання делегатів»
Виконав студент:
групи ПІ-223
Черпак Володимир
Перевірив викладач:
Васильєва М.Д.
Київ 2020
Мета роботи – дослідити механізм обробки подій у мові С#, навчитися
створювати та використовувати делегати.
Завдання
1. Описати на мові С# лямбда-вираз чи анонімний метод згідно з варіантом та
викликати його через делегат з відповідним підписом.*
2. Створити компонент багаторазового використання (клас), що містить член-
подію. Події- об’єкти відповідають деяким подіям реального об’єкта, що
моделюється даним компонентом (наприклад, якщо компонент є моделлю
об’єкта „автомобіль”, подіями можуть бути „початок руху”, „зупинка”,
„закінчення пального” і т. ін.). Для події створити клас-аргумент події. Для
опису події створити новий делегат або використати наявний делегат бібліотеки
FCL (наприклад, EventHandler).**
3. Використовуючи створений у п.3 компонент, створити додаток, у якому
визначити метод-обробник події для цього компонента, що реалізує реакцію
додатка на подію (наприклад, повідомлення користувачеві про виникнення
події). Метод-обробник події повинний отримувати інформацію про об’єкт-
ініціатор події та аргумент події.**
Варіант 12
Лістинг коду
Class Program (з використанням делегатів)
using System;
namespace OOP_4_12
{
public delegate void StringSearch();
class Program
{
static void Main(string[] args)
{
StringSearch method1 = () =>
{
Console.WriteLine("Лямбда-выражение\n");
Console.WriteLine("Введите строку : ");
int letter = 0;
int digit = 0;
int symbol = 0;
}
Console.WriteLine($"\nКоличество букв: {letter}");
Console.WriteLine($"\nКоличество чисел: {digit}");
Console.WriteLine($"\nКоличество остальных симоволов: {symbol}");
Console.WriteLine(new string('-', 20));
};
}
Console.WriteLine($"\nКоличество букв: {letter}");
Console.WriteLine($"\nКоличество чисел: {digit}");
Console.WriteLine($"\nКоличество остальных симоволов: {symbol}");
Console.WriteLine(new string('-', 20));
};
method1();
method2();
Console.ReadKey();
}
}
}
Сlass PoolEventArgs
public class PoolEventArgs
{
public PoolEventArgs(string mes)
{
Message = mes;
}
public string Message { get; }
}
Class Pool
public class Pool
{
public double length { get; set; }
public double width { get; set; }
public double deep { get; set; }
Console.WriteLine("Введите ширину");
string W = Console.ReadLine();
width = Convert.ToDouble(W);
Console.WriteLine("Введите глубину");
string D = Console.ReadLine();
deep = Convert.ToDouble(D);
return size;
Console.WriteLine("Объем не известен!");
}
while (true)
{
Console.WriteLine($"Литров воды в бассейне:{water_liters} л.");
Console.WriteLine("Сколько литров слить?");
class Program
{
static void Main(string[] args)
{
while (true)
{
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(new string('=', 25));
Console.WriteLine("Басейн: ");
Console.WriteLine("1 - Расчитать объем");
Console.WriteLine("2 - Залить воды");
Console.WriteLine("3 - Слить воду");
Console.WriteLine("\n0 - Выход");
string switcher = Console.ReadLine();
switch (switcher)
{
case "1":
Console.Clear();
pool.SizeCalculate();
break;
case "2":
Console.Clear();
pool.PourWater();
break;
case "3":
Console.Clear();
pool.DrainTheWater();
break;
case "0":
Environment.Exit(0);
break;
}
}
Контрольні запитання
1. Роз’ясніть сутність поняття делегата.
Делегати представляють такі об'єкти, які вказують на методи. Тобто делегати
- це покажчики на методи і за допомогою делегатів ми можемо викликати дані
методи.
class Program
{
delegate void Message ();
static void Main (string [] args)
{
Message mes1 = Hello;
mes1 + = HowAreYou; // тепер mes1 вказує на два методу
mes1 (); // викликаються обидва методи - Hello і HowAreYou
Console.Read ();
}
private static void Hello ()
{
Console.WriteLine ( "Hello");
}
private static void HowAreYou ()
{
Console.WriteLine ( "How are you?");
}
}
class Program
{
delegate int Operation (int x, int y);
delegate void Message ();
static void Main (string [] args)
{
Message mes = Hello;
mes ();
Operation op = Add;
op (3, 4);
Console.Read ();
}
private static void Hello () {Console.WriteLine ( "Hello"); }
private static int Add (int x, int y) {return x + y; }
}
class Program
{
delegate int Operation (int x, int y);
delegate void Message ();
static void Main (string [] args)
{
Message mes = Hello;
mes.Invoke ();
Operation op = Add;
op.Invoke (3, 4);
Console.Read ();
}
private static void Hello () {Console.WriteLine ( "Hello"); }
private static int Add (int x, int y) {return x + y; }
}
ЧЛЕН ПРИЗНАЧЕННЯ
delegate (параметри)
{
// інструкції
}
наприклад:
class Program
{
delegate void MessageHandler (string message);
static void Main (string [] args)
{
MessageHandler handler = delegate (string mes)
{
Console.WriteLine (mes);
};
handler ("hello world!");
Console.Read ();
}
}
class Program
{
delegate int Operation (int x, int y);
static void Main (string [] args)
{
Operation operation = (x, y) => x + y;
Console.WriteLine (operation (10, 20)); // 30
Console.WriteLine (operation (40, 20)); // 60
Console.Read ();
}
}
public ArifmeticFunc()
{
EventOverflow += OutOfRangeHandler; // задать метод для вызова сообщения о
событии
}
public void OutOfRangeHandler()
{
Console.WriteLine("Array is overflowed");
}
}
Подія – автоматичне повідомлення про виконання деякої дії.
Метод, який обробляє подію, повинен приймати ті самі параметри, як і
делегат, і повертати той тип, що і делегат.