X Код для використання на сайті:
Ширина px

Скопіюйте цей код і вставте його на свій сайт

X Для завантаження презентації, скористайтесь соціальною кнопкою для рекомендації сервісу SvitPPT Завантажити собі цю презентацію

Презентація на тему:
Об’єктні властивості C#

Завантажити презентацію

Об’єктні властивості C#

Завантажити презентацію

Презентація по слайдам:

Слайд 1

Тема №4 Об’єктні властивості C#

Слайд 2

Класи і об’єкти Поняття класу та об’єкту в C# в цілому співпадає з загальноприйнятим. Опис класу: class KlName { члени класу }

Слайд 3

Reference Type: загальна характеристика Загальна риса: доступ до змінних цих типів здійснюється через вказівники на них. Але: змінні вказівникових типів ведуть себе подібно до вказівників. Такими типами є, наприклад: екземпляри класів, в т.ч. рядки; масиви. null - спеціальне значення для пустого вказівника.

Слайд 4

Характерний приклад Нехай є клас Kl і оголошення Kl ekz; Чи означає це оголошення створення екземпляру класу і виділення пам’яті під нього? Ні, створюється лише вказівник відповідного типу. Сам екземпляр створюється шляхом виклику конструктора класу: Kl ekz = new Kl(…); Аналогічно - операції.

Слайд 5

Екземпляри класів a vN1a N1 vN2a N2 b vN1b N1 vN2b N2 b=a; b.N1=vNEW; вив. a.N1; //vNEW

Слайд 6

Рядки: особливість (рядки є незмінюваними) a “AAAA” b “BBBB” b=a; b=“CCCC”; вив. а; //AAAA “CCCC”

Слайд 7

Модифікатори доступу public – загальнодоступні; protected – доступні для підкласів; internal – доступні для класів в межах тієї ж збірки; internal protected – доступні для підкласів, а також для будь-яких класів у межах збірки; private - тільки для класу, в якому вони визначені (для членів класу – за замовченням).

Слайд 8

Поняття властивості Концепція властивостей є однією з найбільш характерних рис C#. Властивість – це конструкція, яка передбачає методи get та/або set для отримання або встановлення відповідного значення.

Слайд 9

Приклад властивості (“класичний” синтаксис) У класі: int QP; public int Q { get { return QP; } set { QP = value; } } У клієнті, який використовує клас: sp.Q = 2;

Слайд 10

Властивості: коментар до прикладу Ззовні звернення до властивості виглядає як звернення до поля. У найбільш типовому випадку властивість пов’язана з окремим полем, але це не обов’язково. У цьому випадку може бути так, що деяка властивість L встановлюється в одне значення, а при зчитуванні отримуємо інше значення. Якщо потрібно тільки для читання або для запису – тільки get або, відповідно, set.

Слайд 11

Приклад public int L { get { return QP + LP; } set { LP = value; } }

Слайд 12

З 2.0 – можливість розділення прав доступу В С# 2.0 з’явилася можливість розділити права доступу для селекторів (get) і модифікаторів (set). Приклад: public int L { get { return QP + LP; } private set { LP = value; } }

Слайд 13

Новий спрощений синтаксис для властивостей – з C# 3.0 public int R { get; set; }

Слайд 14

Індексатори Відповідають параметризованим властивостям специфікації CLR. В C# - щось подібне до встановлення операції звернення за індексом. Приклад – клас, який реалізує “безпечний” масив, тобто при зверненні до елементу масиву в межах допустимого діапазону повертається відповідне значення, в іншому випадку – 0. При цьому бажано, щоб звернення відбувалося так, як звичайне звернення до масиву, а нумерація починалася з 1.

Слайд 15

Код класу з індексатором class Kl { public int[] M = new int[10]; // базовий масив public int this[int index] { get { if ((index 0)) return M[index - 1]; else return 0; } set { if ((index0)) M[index-1] = value; } } }

Слайд 16

Індексатори: інші типові використання “Неявний” масив, тобто звернення як до масиву, але значення обчислюється динамічно. Якщо потрібно в класі реалізувати щось на зразок асоціативного масиву.

Слайд 17

Створення об’єктів. Конструктори За допомогою оператора new: KlName ekz=new KlName(параметри); І за синтаксисом, і за семантикою це виклик конструктора - спеціального методу, який описує, які дії повинні виконуватися при ініціалізації об’єкта. Синтаксично - метод, ім’я якого співпадає з іменем класу. Нічого не повертає (навіть void). Конструктори можуть бути перевантажені. Якщо конструкторів немає - надається конструктор за замовченням. Але, якщо є хоча б один конструктор - конструктор за замовченням не надається.

Слайд 18

Новий синтаксис ініціалізації об’єктів – з C# 3.0 Kl s1 = new Kl { R = 30 }; Семантично це еквівалентно виклику конструктора класу без параметрів і встановленню значень полів або властивостей.

Слайд 19

Cпадкування class K1 : K2 { . . . } К1-підклас; К2-суперклас. Так само, як і Java, C# не підтримує множинного спадкування. На вершині ієрархії – клас System.Object.

Слайд 20

Закриті класи і методи Модифікатор sealed. Для класів цей модифікатор означає, що від цього класу не можна утворювати похідні класи. Таким є, наприклад, клас string. Для методів цей модифікатор означає, що цей метод не можна перевизначати в підкласах.

Слайд 21

Вказівники this та base this - вказівник на даний екземпляр. Передається методам екземпляра (нестатичним методам) як неявний параметр. Одне з типових використань - в конструкторах. base – посилання на суперклас (нестатичне).

Слайд 22

Виклик іншого конструктора Того ж класу: public Kl(…):this(…) { … } Суперкласу: public Kl(…):base(…) { … }

Слайд 23

Статичні поля і методи Супроводжуються модифікатором static. Поля і методи класу, а не екземпляру. Для статичних полів - одна копія для всіх екземплярів; для нестатичних - кожний екземпляр має свою копію. Одне з типових використань - підрахунок кількості екземплярів класу. Виклик - через ім’я класу. З статичними полями і методами можна працювати, коли ще немає жодного екземпляра.

Слайд 24

Статичні поля і методи: продовження Статичні методи не можуть викликати нестатичні методи, а також звертатися до нестатичних полів. Типовий механізм ініціалізації статичних полів – статичний конструктор, тобто конструктор з модифікатором static. Статичним може бути і весь клас – якщо в ньому є лише статичні члени. Неможливо створити екземпляр такого класу; звернення до методів можуть бути тільки статичними.

Слайд 25

Приклад статичного класу (ілюструється також readonly) static class Stalker { static readonly public int Pole; static Stalker() //статичний конструктор { Pole = 10; } static public void Metod() { Console.WriteLine(Pole); } }

Слайд 26

Ланцюжки конструкторів Ситуація, подібна до Java. Перед виконанням конструктора підкласу автоматично викликається конструктор суперкласу.

Слайд 27

Перевантаження методів та операторів Методи, а також конструктори класу, можуть бути перевантажені. Це означає, що в одному класі може бути кілька методів з однаковим іменем; їх розрізнення здійснюється за кількістю і типом аргументів. На відміну від Java, оператори також можуть перевантажуватися!

Слайд 28

Поліморфізм у C#: початок Об’єктна змінна суперкласу може посилатися на екземпляр підкласу, або посиланню на суперклас може бути надано значення посилання на підклас (розширююче перетворення). Розширююче перетворення здійснюється автоматично; знижуюче слід робити явно. “Безпечне” приведення – as. Перевірка типу – is.

Слайд 29

Поліморфізм: віртуальні функції Класичний приклад: оголошуємо клас Base з методом Metod та його підклас Sub, в якому теж є метод Metod. Створюємо екземпляр класу Sub і викликаємо метод Metod. Метод якого саме класу буде викликаний?

Слайд 30

Віртуальні функції: загальні орієнтири За замовченням методи C# не є віртуальними, але їх можна зробити віртуальними за допомогою модифікатора virtual. Статичні, а також приватні методи не можуть бути віртуальними. Важливі модифікатори: override – заміщення; new – затінення.

Слайд 31

Демонстрація: Polimorf class Bas { public virtual void Metod() { Console.WriteLine("Base class"); } } class Der : Bas { public void Metod() // new чи override ? { Console.WriteLine("Derived class"); } }

Слайд 32

Використання Bas b = new Der(); //якщо var – може бути //інакше b.Metod();

Слайд 33

Quiz: що виведе програма static void Main(string[] args) { D d = new D(); C c = d; B b = c; A a = b; d.M(); c.M(); b.M(); a.M(); Console.ReadLine(); } } class A { public virtual void M() { Console.Write("A"); } } class B:A { public override void M() { Console.Write("B");} } class C : B { new public virtual void M() { Console.Write(“С");} } class D : C { public override void M() {Console.Write("D"); } }

Слайд 34

Абстрактні методи і класи Абстрактний метод - метод без реалізації; він супроводжується модифікатором abstract. Передбачається, що такі методи повинні перевизначатися в підкласах. Тому абстрактні методи автоматично є віртуальними. Абстрактні методи не мають тіла: public abstract int fun(); Якщо клас містить хоча б один абстрактний метод, він сам повинен бути оголошений як абстрактний. Для абстрактного класу не можна створювати екземпляри.

Слайд 35

Інтерфейси Логічний розвиток ідеї абстрактних класів. Всі методи інтерфейсу є абстрактними і неявно є public. Інтерфейси не можуть містити полів (на відміну від Java). Але інтерфейси можуть містити властивості. В C# прийнято починати назви інтерфейсів з літери I, закінчуються вони часто на able.

Слайд 36

Реалізація інтерфейсів Можна сказати, що інтерфейс - це набір вимог, які висуваються до класу, що його реалізує. Якщо клас реалізує інтерфейс, то він повинен визначити всі методи, які описані в інтерфейсі. Синтаксис: class Kl : I {… Клас може реалізувати декілька інтерфейсів; у цьому випадку вони перелічуються через кому. Якщо, крім цього, клас Kl спадкує від іншого класу B та реалізує кілька інтерфейсів – class Kl: B,I1,I2,… Між інтерфейсами може бути відношення спадкування, причому таке спадкування може бути множинним.

Слайд 37

Приклад: інтерфейс interface I { int Pole { get; set; } void Metod(); } class Kl : I { public int Pole { get; set; } public void Metod() { Console.WriteLine("Interface implemented with field "+Pole); } }

Слайд 38

Явна реалізація інтерфейсів. Закриття методу інтерфейсу в класі; тоді для звернення до такого методу треба використовувати вказівник інтерфейсу. Випадок, коли реалізується кілька інтерфейсів, і відповідний метод для кожного інтерфейсу потрібно визначити по-своєму.

Слайд 39

Приклад явної реалізації інтерфейсів. Інтерфейси interface I1 { void Metod(); } interface I2 { void Metod(); }

Слайд 40

Приклад явної реалізації інтерфейсів. Клас class Kl : I1,I2 { void I1.Metod() { Console.WriteLine("First Interface"); } void I2.Metod() { Console.WriteLine("Second Interface"); } }

Слайд 41

Приклад явної реалізації інтерфейсів. Звернення I1 ekz1 = new Kl(); I2 ekz2 = (I2) ekz1; //один об’єкт – різні типи! ekz1.Metod(); ekz2.Metod();

Слайд 42

Перевантаження операторів - приклад class Kl { public int Pole; public Kl(int Pole) { this.Pole = Pole; } public static Kl operator +(Kl a, Kl b) { return new Kl(a.Pole + b.Pole); } }

Слайд 43

В основній програмі class Program { static void Main(string[] args) { Kl a = new Kl(10) + new Kl(15); Console.WriteLine(a.Pole); Console.ReadLine(); } }

Слайд 44

Перевантаження операторів – деякі особливості Всі оператори мають бути описані як public і static. Не можна перевантажувати ряд операторів, зокрема =. Якщо перевантажується +, то += перевантажується автоматично. Можуть перевантажуватися true та false (буде робитися приклад на цю тему). Для операторів приведення типів може бути заданий явний або неявний режим виклику (див. наступний слайд).

Слайд 45

Модифікатори explicit та implicit Використовуються у визначеннях операторів приведення типів для задання того, чи буде перетворення здійснюватися неявно, чи приведення типів слід робити явним чином.

Слайд 46

Делегати Прийнято характеризувати делегати як вказівники на функції. Типові використання: передача методів як параметрів; організація обробки подій (для цього є спеціальний механізм, тісно пов’язаний з делегатами).

Слайд 47

Приклад: непрямий виклик функцій delegate void MyFun(int x); class Program { static void Main(string[] args) { Kl ekz = new Kl(); ekz.Pole = 20; MyFun deleg = ekz.Fun; deleg(3); Console.ReadLine(); } } class Kl { public int Pole {get; set;} public void Fun(int q) { Console.WriteLine(Pole*q); } }

Слайд 48

Делегати як параметри delegate double MyFun(double x); class Program { static void DoSth (MyFun f, double y) { //Делегат як параметр Console.WriteLine( f(y) );} static double Kvadrat(double y) {return y * y; } //Власний метод static void Main(string[] args) { DoSth( Math.Sin, Math.PI/2); //Використання існуючих //методів DoSth( Math.Cos, Math.PI/2); DoSth(Program.Kvadrat, 5); //Використання власних методів DoSth( delegate (double x) { return x / 5; //Анонімний метод; в 3.0 – спрощений //синтаксис } , 20 );

Слайд 49

Ще один приклад: сортування колекції List ls = new List(); ls.Add("qwerty"); ls.Add("a"); ls.Add("This string is extremely large"); ls.Add("This string is large"); ls.Sort(delegate(String s1, String s2) { return s2.Length - s1.Length; });

Слайд 50

Ламбда-вирази: приклад DoSth(x => x/5, 20);

Слайд 51

Однотипні операції над масивом int[] a = { 1, 3, 5 }; Array.ForEach(a, delegate(int x) { int y = x * 2; Console.WriteLine(y); } );

Слайд 52

Події Механізм подій суттєво спирається на концепцію делегатів. Приклад: два джерела подій (s1 та s2) та три слухача, які можуть реєструвати свою зацікавленість у події.

Слайд 53

Опис делегата public delegate void Ev (Source sender, MyEventArgs e);

Слайд 54

Клас, який описує параметри події public class MyEventArgs : EventArgs { //Новий параметр public string Message { get; set; } }

Слайд 55

Клас джерела події public class Source {//Оголошення події public event Ev MyEvent; public string Name { get; set; } void Notify(string mars) { // виклик делегата MyEvent(this, new MyEventArgs { Message = mars }); } public void GenerateNewEvent(string mars) { Notify(mars); } }

Слайд 56

Клас слухача public class MyObserver { public string Name { get; set; } // обробник події public void EvHandler(Source sender, MyEventArgs args) { Console.WriteLine("{0} received message {1} from {2}", this.Name, args.Message, sender.Name); } public void RegisterInterest(Source source) { // додавання до події нового обробника source.MyEvent+=new Ev(this.EvHandler); } }

Слайд 57

Основна програма //Три слухача MyObserver o1 = new MyObserver { Name = "O1" }; MyObserver o2 = new MyObserver { Name = "02" }; MyObserver o3 = new MyObserver { Name = "03" }; //Два джерела Source s1 = new Source { Name = "S1" }; Source s2 = new Source { Name = "S2" }; //Реєстрація слухачів o1.RegisterInterest(s1); o2.RegisterInterest(s1); o2.RegisterInterest(s2); o3.RegisterInterest(s2); //Генерація подій s1.GenerateNewEvent("E1"); s2.GenerateNewEvent("E1");

Слайд 58

Структури Структури – типи даних, які багато в чому подібні до класів (з певними обмеженнями), але структури – це ValueType!

Слайд 59

Приклад структури struct Person { public string Name; public int Age; public Person(String Name, int Age) { this.Name = Name; this.Age = Age; } public override string ToString() { return Name + " - " + Age; } }

Слайд 60

Використання структур // Різні способи ініціалізації Person t1; // new не обов’язкове t1.Age = 10; t1.Name = "Ivanov"; Person t2 = new Person(); // але можливе t2.Name = "Petrov"; t2.Age = 105; Person t3 = new Person { Name = "Sidorov", Age = 37 }; Person t4 = t1; //копіювання, характерне для Value Type t4.Age = 99; Person t5 = new Person("Hun Vei Bin", 18);

Слайд 61

Структури: деякі обмеження Структури не підтримують спадкування, але можуть реалізовувати інтерфейси. Можуть бути конструктори, але не можна задати конструктор за замовченням. В структурах не можна ініціалізувати поля за замовченням.

Слайд 62

Навіщо потрібні структури Питання ефективності: доступ здійснюється напряму, а не через вказівники.

Слайд 63

Колекції Високорівневі структури даних. Колекція повинна реалізовувати, як мінімум, інтерфейс System.Collections.IEnumerable. Як ми бачили, для перебору елементів колекції може застосовуватися foreach.

Слайд 64

Базовий набір колекцій ArrayList; Stack; Queue; SortedList; Hashtable

Слайд 65

Приклад використання колекцій (Hashtable) Hashtable ht = new Hashtable(); ht.Add("a", "AAAA"); ht.Add("b", "BBBB"); ht.Add("q", "QQQQ"); foreach (var r in ht.Keys) { Console.WriteLine(r + " : " + ht[r]); }

Слайд 66

Узагальнені колекції List; Dictionary; SortedList; LinkedList; Queue; Stack

Слайд 67

Сортування колекції з використанням LINQ List ls = new List(); ls.Add("qwerty"); ls.Add("a"); ls.Add("This string is extremely large"); ls.Add("This string is large"); var ls1 = from ll in ls orderby ll.Length select ll; foreach (var lll in ls1) { Console.WriteLine(lll); };

Слайд 68

Узагальнені класи Можна створювати і використовувати узагальнені (параметризовані) класи.

Слайд 69

Атрибути Атрибути дозволяють вносити до програми додаткову описову інформацію про класи, методи і т.п. Фактично – метадані. Беруться в квадратні дужки. Певна кількість вбудованих атрибутів (Conditional, AttributeUsage, Obsolete, DllImport, …). Можна створювати власні атрибути.

Слайд 70

Умовні методи: атрибут Conditional #define RELEASE using System; using System.Collections.Generic; using System.Text; namespace UsingAttributes { class Program { [System.Diagnostics.Conditional("DEBUG")] static void ShowDebug() { Console.WriteLine("Пробна версія"); } [System.Diagnostics.Conditional("RELEASE")] static void ShowRelease() { Console.WriteLine("Фінальна версія"); } static void Main(string[] args) { ShowDebug(); ShowRelease(); Console.ReadLine(); } }}

Слайд 71

Деструктори В C# немає аналога delete. Збирання “сміття” (об’єктів, на які не залишилося доступних посилань), здійснюється збирачем сміття автоматично. Можна описати деструктор, який буде викликаний збирачем сміття перед знищенням об’єкта. Деструктор автоматично компілюється в метод Finalize, який гарантовано викликає аналогічний метод для батьківського класу. Форсоване збирання сміття – GC.Collect().

Слайд 72

Приклад класу з деструктором class Kl { static int i = 1; public int Number = 0; public Kl() { this.Number = i++; Console.WriteLine("Створено об'єкт з номером {0}", this.Number); ~Kl() { Console.WriteLine("Знищено об'єкт з номером {0}", this.Number); } }

Слайд 73

Покоління Для збирача сміття важливим є термін “покоління”. Нульове, перше, друге. Об’єкти, які залишилися після збирання сміття, переходять до наступного покоління. Збір сміття починається з нульового покоління.

Слайд 74

Альтернатива деструкторам Інтерфейс IDisposable та метод Dispose. Більш явне керування процесом звільнення непотрібних ресурсів.

Слайд 75

Методи-розширення Нова риса, яка з’явилася починаючи з C# 3.0. Можливість розширення функціональності вже існуючих класів. Статичні методи в статичному класі; перший параметр методу – відповідний клас з модифікатором this. Концептуально дещо нагадує закрите спадкування. Корисно, якщо клас закритий.

Слайд 76

Приклад: розширення класу int static class Ext { public static int Add(this int i, int N) { return i+N; } }

Слайд 77

Приклад: використання int i = 3; int k = i.Add(4);

Слайд 78

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

Слайд 79

Основи багатопотоковості В C# в межах однієї програми може бути запущено декілька потоків. Простір імен System.Threading. Використовується делегат ThreadStart. Типовий запуск: ThreadStart st = new ThreadStart(метод); Thread t = new Thread(st); t.Start();

Завантажити презентацію

Презентації по предмету Інформатика