C# – повністю об’єктно-орієнтована мова. C# – повністю об’єктно-орієнтована мова


НазваC# – повністю об’єктно-орієнтована мова. C# – повністю об’єктно-орієнтована мова
Дата конвертації13.03.2013
Розмір445 b.
ТипПрезентации



C# – повністю об’єктно-орієнтована мова.

  • C# – повністю об’єктно-орієнтована мова.

  • Всі змінні – об’єкти.

  • Немає множинного спадкування класів.

  • Доступ до екземплярів Reference Type здійснюється виключно через указники на них.

  • Відсутній аналог delete.

  • Методи класу можуть бути перевантажені, розрізнення – за сигнатурою.

  • Можна визначати операції, в т.ч. індексатори.

  • Властивості.

  • За замовченням параметри методів передаються за значенням, це можна змінювати.



На вершині ієрархії – клас Object.

  • На вершині ієрархії – клас Object.

  • Поліморфізм: за замовченням методи невіртуальні; це можна змінювати.

  • Вводяться інтерфейси як абстракція, що тільки декларує поведінку, але не визначає її.

  • Неявно типовані змінні.

  • Generics.

  • Ініціалізатори класів.

  • Розвинені засоби RTTI та інтроспекції.

  • Часткові класи.

  • Анонімні класи та анонімні методи.

  • Делегати.

  • Події.



Розширюючі методи.

  • Розширюючі методи.

  • Риси, характерні для функціонального програмування (ламбда-вирази і т.п).

  • LINQ.



Поняття класу та об’єкту в C# в цілому співпадає з загальноприйнятим.

  • Поняття класу та об’єкту в C# в цілому співпадає з загальноприйнятим.

  • Опис класу:

  • class KlName {

  • члени класу

  • }



Загальна риса: доступ до змінних цих типів здійснюється через вказівники на них.

  • Загальна риса: доступ до змінних цих типів здійснюється через вказівники на них.

  • Але: змінні вказівникових типів ведуть себе подібно до вказівників.

  • Такими типами є, наприклад: екземпляри класів, в т.ч. рядки; масиви.

  • null - спеціальне значення для пустого вказівника.



За допомогою оператора new:

  • За допомогою оператора new:

  • KlName ekz=new KlName(параметри);

  • І за синтаксисом, і за семантикою це виклик конструктора - спеціального методу, який описує, які дії повинні виконуватися при ініціалізації об’єкта.

  • Синтаксично - метод, ім’я якого співпадає з іменем класу. Нічого не повертає (навіть void).

  • Конструктори можуть бути перевантажені.

  • Якщо конструкторів немає - надається конструктор за замовченням.

  • Але, якщо є хоча б один конструктор - конструктор за замовченням не надається.



Нехай є клас Kl і оголошення

  • Нехай є клас Kl і оголошення

  • Kl ekz;

  • Чи означає це оголошення створення екземпляру класу і виділення пам’яті під нього?

  • Ні, створюється лише вказівник відповідного типу.

  • Сам екземпляр створюється шляхом виклику конструктора класу:

  • Kl ekz = new Kl(…);

  • Аналогічно - операції.







public – загальнодоступні;

  • public – загальнодоступні;

  • protected – доступні для підкласів;

  • internal – доступні для класів в межах тієї ж збірки;

  • internal protected – доступні для підкласів, а також для будь-яких класів у межах збірки;

  • private - тільки для класу, в якому вони визначені (для членів класу – за замовченням).



Чи може конструктор класу бути приватним?

  • Чи може конструктор класу бути приватним?





Концепція властивостей є однією з найбільш характерних рис C#.

  • Концепція властивостей є однією з найбільш характерних рис C#.

  • Властивість – це конструкція, яка передбачає методи get та/або set для отримання або встановлення відповідного значення.



У класі:

  • У класі:

  • int QP;

  • public int Q

  • {

  • get { return QP; }

  • set { QP = value; }

  • }

  • У клієнті, який використовує клас:

  • sp.Q = 2;



Ззовні звернення до властивості виглядає як звернення до поля.

  • Ззовні звернення до властивості виглядає як звернення до поля.

  • У найбільш типовому випадку властивість пов’язана з окремим полем, але це не обов’язково. У цьому випадку може бути так, що деяка властивість L встановлюється в одне значення, а при зчитуванні отримуємо інше значення.

  • Якщо потрібно тільки для читання або для запису – тільки get або, відповідно, set.



public int L

  • public int L

  • {

  • get { return QP + LP; }

  • set { LP = value; }

  • }



В С# 2.0 з’явилася можливість розділити права доступу для селекторів (get) і модифікаторів (set).

  • В С# 2.0 з’явилася можливість розділити права доступу для селекторів (get) і модифікаторів (set).

  • Приклад:

  • public int L

  • {

  • get { return QP + LP; }

  • private set { LP = value; }

  • }



public int R { get; set; }

  • public int R { get; set; }



Kl s1 = new Kl { R = 30 };

  • Kl s1 = new Kl { R = 30 };

  • Семантично це еквівалентно виклику конструктора класу без параметрів і встановленню значень полів або властивостей.



class K1 : K2 {

  • class K1 : K2 {

  • . . .

  • }

  • К1-підклас; К2-суперклас.

  • Так само, як і Java, C# не підтримує множинного спадкування.

  • На вершині ієрархії – клас System.Object.



Модифікатор sealed.

  • Модифікатор sealed.

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

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



this - вказівник на даний екземпляр.

  • this - вказівник на даний екземпляр.

  • Передається методам екземпляра (нестатичним методам) як неявний параметр.

  • Одне з типових використань - в конструкторах.

  • base – посилання на суперклас (нестатичне).



Того ж класу:

  • Того ж класу:

  • public Kl(…):this(…) {

  • }

  • Суперкласу:

  • public Kl(…):base(…) {

  • }



Супроводжуються модифікатором static.

  • Супроводжуються модифікатором static.

  • Поля і методи класу, а не екземпляру.

  • Для статичних полів - одна копія для всіх екземплярів; для нестатичних - кожний екземпляр має свою копію. Одне з типових використань - підрахунок кількості екземплярів класу.

  • Виклик - через ім’я класу.

  • З статичними полями і методами можна працювати, коли ще немає жодного екземпляра.



Статичні методи не можуть викликати нестатичні методи, а також звертатися до нестатичних полів.

  • Статичні методи не можуть викликати нестатичні методи, а також звертатися до нестатичних полів.

  • Типовий механізм ініціалізації статичних полів – статичний конструктор, тобто конструктор з модифікатором static.

  • Статичним може бути і весь клас – якщо в ньому є лише статичні члени. Неможливо створити екземпляр такого класу; звернення до методів можуть бути тільки статичними.



static class Stalker

  • static class Stalker

  • {

  • static readonly public int Pole;

  • static Stalker() //статичний конструктор

  • {

  • Pole = 10;

  • }

  • static public void Metod()

  • {

  • Console.WriteLine(Pole);

  • }

  • }



Перед виконанням конструктора підкласу автоматично викликається конструктор суперкласу.

  • Перед виконанням конструктора підкласу автоматично викликається конструктор суперкласу.



Об’єктна змінна суперкласу може посилатися на екземпляр підкласу, або посиланню на суперклас може бути надано значення посилання на підклас (розширююче перетворення).

  • Об’єктна змінна суперкласу може посилатися на екземпляр підкласу, або посиланню на суперклас може бути надано значення посилання на підклас (розширююче перетворення).

  • Розширююче перетворення здійснюється автоматично; знижуюче слід робити явно.

  • “Безпечне” приведення – as.

  • Перевірка типу – is.



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

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



За замовченням методи C# не є віртуальними, але їх можна зробити віртуальними за допомогою модифікатора virtual.

  • За замовченням методи C# не є віртуальними, але їх можна зробити віртуальними за допомогою модифікатора virtual.

  • Статичні, а також приватні методи не можуть бути віртуальними.

  • Важливі модифікатори: override – заміщення; new – затінення.



class Bas

  • class Bas

  • {

  • public virtual void Metod()

  • {

  • Console.WriteLine("Base class");

  • }

  • }

  • class Der : Bas

  • {

  • public void Metod() // new чи override ?

  • {

  • Console.WriteLine("Derived class");

  • }

  • }



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

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

  • b.Metod();



static void Main(string[] args) {

  • 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"); }

  • }



Абстрактний метод - метод без реалізації; він супроводжується модифікатором abstract.

  • Абстрактний метод - метод без реалізації; він супроводжується модифікатором abstract.

  • Передбачається, що такі методи повинні перевизначатися в підкласах. Тому абстрактні методи автоматично є віртуальними.

  • Абстрактні методи не мають тіла:

  • public abstract int fun();

  • Якщо клас містить хоча б один абстрактний метод, він сам повинен бути оголошений як абстрактний.

  • Для абстрактного класу не можна створювати екземпляри.



Логічний розвиток ідеї абстрактних класів.

  • Логічний розвиток ідеї абстрактних класів.

  • Всі методи інтерфейсу є абстрактними і неявно є public (хоча явно вказувати ці модифікатори не дозволяється).

  • Інтерфейси не можуть містити полів (на відміну від Java).

  • Але інтерфейси можуть містити властивості.

  • В C# прийнято починати назви інтерфейсів з літери I, закінчуються вони часто на able.



Можна сказати, що інтерфейс - це набір вимог, які висуваються до класу, що його реалізує.

  • Можна сказати, що інтерфейс - це набір вимог, які висуваються до класу, що його реалізує.

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

  • Синтаксис: class Kl : I {…

  • Клас може реалізувати декілька інтерфейсів; у цьому випадку вони перелічуються через кому.

  • Якщо, крім цього, клас Kl спадкує від іншого класу B та реалізує кілька інтерфейсів – class Kl: B,I1,I2,…

  • Між інтерфейсами може бути відношення спадкування, причому таке спадкування може бути множинним.



interface I

  • 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);

  • }

  • }



Закриття методу інтерфейсу в класі; тоді для звернення до такого методу треба використовувати вказівник інтерфейсу.

  • Закриття методу інтерфейсу в класі; тоді для звернення до такого методу треба використовувати вказівник інтерфейсу.

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



interface I1

  • interface I1

  • {

  • void Metod();

  • }

  • interface I2

  • {

  • void Metod();

  • }



class Kl : I1,I2

  • class Kl : I1,I2

  • {

  • void I1.Metod()

  • {

  • Console.WriteLine("First Interface");

  • }

  • void I2.Metod()

  • {

  • Console.WriteLine("Second Interface");

  • }

  • }



I1 ekz1 = new Kl();

  • I1 ekz1 = new Kl();

  • I2 ekz2 = (I2) ekz1; //один об’єкт – різні типи!

  • ekz1.Metod();

  • ekz2.Metod();



class Kl

  • 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);

  • }

  • }



class Program

  • class Program

  • {

  • static void Main(string[] args)

  • {

  • Kl a = new Kl(10) + new Kl(15);

  • Console.WriteLine(a.Pole);

  • Console.ReadLine();

  • }

  • }



Всі оператори мають бути описані як public і static.

  • Всі оператори мають бути описані як public і static.

  • Не можна перевантажувати ряд операторів, зокрема =.

  • Якщо перевантажується +, то += перевантажується автоматично.

  • Можуть перевантажуватися true та false (буде робитися приклад на цю тему).

  • Для операторів приведення типів може бути заданий явний або неявний режим виклику (див. наступний слайд).



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

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



class Person

  • class Person

  • {

  • public String Name { get; set; }

  • public String Citizen { get; set; }

  • public static implicit operator String (Person p)

  • {return String.Format("Name: {0} ; Citizen: {1}",p.Name,p.Citizen);

  • }

  • }



Person p1 = new Person { Name = "Bob Robber", Citizen = "UK" };

  • Person p1 = new Person { Name = "Bob Robber", Citizen = "UK" };

  • String s = p1;

  • Console.WriteLine(s);



class Person

  • class Person

  • {

  • public String Name { get; set; }

  • public String Citizen { get; set; }

  • public static explicit operator String (Person p)

  • {return String.Format("Name: {0} ; Citizen: {1}",p.Name,p.Citizen);

  • }

  • }



Person p1 = new Person { Name = "Bob Robber", Citizen = "UK" };

  • Person p1 = new Person { Name = "Bob Robber", Citizen = "UK" };

  • String s = (String)p1;

  • Console.WriteLine(s);



Відповідають параметризованим властивостям специфікації CLR.

  • Відповідають параметризованим властивостям специфікації CLR.

  • В C# - щось подібне до встановлення операції звернення за індексом.

  • Приклад – клас, який реалізує “безпечний” масив, тобто при зверненні до елементу масиву в межах допустимого діапазону повертається відповідне значення, в іншому випадку – 0. При цьому бажано, щоб звернення відбувалося так, як звичайне звернення до масиву, а нумерація починалася з 1.



class Kl

  • class Kl

  • {

  • public int[] M = new int[10]; // базовий масив

  • public int this[int index]

  • {

  • get

  • {

  • if ((index <= 10) && (index > 0)) return M[index - 1];

  • else return 0;

  • }

  • set

  • {

  • if ((index<=10)&&(index>0)) M[index-1] = value;

  • }

  • }

  • }



“Неявний” масив, тобто звернення як до масиву, але значення обчислюється динамічно.

  • “Неявний” масив, тобто звернення як до масиву, але значення обчислюється динамічно.

  • Якщо потрібно в класі реалізувати щось на зразок асоціативного масиву.



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

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



struct Person

  • 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;

  • }

  • }



// Різні способи ініціалізації

  • // Різні способи ініціалізації

  • 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);



Структури не підтримують спадкування, але можуть реалізовувати інтерфейси.

  • Структури не підтримують спадкування, але можуть реалізовувати інтерфейси.

  • Можуть бути конструктори, але не можна задати конструктор за замовченням.

  • В структурах не можна ініціалізувати поля за замовченням.



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

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



В C# немає аналога delete.

  • В C# немає аналога delete.

  • Збирання “сміття” (об’єктів, на які не залишилося доступних посилань), здійснюється збирачем сміття автоматично.

  • Можна описати деструктор, який буде викликаний збирачем сміття перед знищенням об’єкта. Деструктор автоматично компілюється в метод Finalize, який гарантовано викликає аналогічний метод для батьківського класу.

  • Форсоване збирання сміття – GC.Collect().



class Kl {

  • 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);

  • }

  • }



Для збирача сміття важливим є термін “покоління”.

  • Для збирача сміття важливим є термін “покоління”.

  • Нульове, перше, друге.

  • Об’єкти, які залишилися після збирання сміття, переходять до наступного покоління.

  • Збір сміття починається з нульового покоління.



Інтерфейс IDisposable та метод Dispose.

  • Інтерфейс IDisposable та метод Dispose.

  • Більш явне керування процесом звільнення непотрібних ресурсів.

  • Рекомендується комбінувати з деструкторами.



class MyClass : IDisposable

  • class MyClass : IDisposable

  • {

  • public void Dispose()

  • {

  • Console.WriteLine("The end of honorless existence");

  • }

  • }



try

  • try

  • {

  • MyClass inst = new MyClass();

  • }

  • finally

  • {

  • if (inst != null)

  • {

  • inst.Dispose();

  • }

  • }

  • }



using (MyClass inst = new MyClass())

  • using (MyClass inst = new MyClass())

  • {

  • }



Схожі:

C# – повністю об’єктно-орієнтована мова. C# – повністю об’єктно-орієнтована мова iconJava – повністю об’єктно-орієнтована мова. Java – повністю об’єктно-орієнтована мова

C# – повністю об’єктно-орієнтована мова. C# – повністю об’єктно-орієнтована мова iconУніфікована мова моделювання uml. Загальна характеристика 2007 Зміст
На сьогодні вона підтримується багатьма об'єктно-орієнтованими інструментальними системами
C# – повністю об’єктно-орієнтована мова. C# – повністю об’єктно-орієнтована мова iconУніфікована мова моделювання uml. Загальна характеристика 2007 Зміст
На сьогодні вона підтримується багатьма об'єктно-орієнтованими інструментальними системами
C# – повністю об’єктно-орієнтована мова. C# – повністю об’єктно-орієнтована мова iconУніфікована мова моделювання uml. Загальна характеристика 2003-2010 Зміст
На сьогодні вона підтримується багатьма об'єктно-орієнтованими інструментальними системами
C# – повністю об’єктно-орієнтована мова. C# – повністю об’єктно-орієнтована мова iconУніфікована мова моделювання uml. Загальна характеристика 2003-2010 Зміст
На сьогодні вона підтримується багатьма об'єктно-орієнтованими інструментальними системами
C# – повністю об’єктно-орієнтована мова. C# – повністю об’єктно-орієнтована мова icon21 лютого – день рідної мови
«Мова народу найбільший національний скарб\ О. Гончар «Мова наша, мова мова кольорова в ній гроза травнева, й тиша вечорова»
C# – повністю об’єктно-орієнтована мова. C# – повністю об’єктно-орієнтована мова iconУкраїнська мова: історія І сучасність план Українська мова серед інших мов світу
...
C# – повністю об’єктно-орієнтована мова. C# – повністю об’єктно-орієнтована мова icon“Мови і літератури“ (українська мова (мова і читання), російська мова (мова і читання))
Формування навичок здорового способу життя та безпечної поведінки здійснюється в рамках курсу та інтегрується частково у змісті всіх...
C# – повністю об’єктно-орієнтована мова. C# – повністю об’єктно-орієнтована мова iconМинуще все, лиш слово не мине мова народу – найбільший національний скарб О. Гончар
«Мова народу найбільший національний скарб\ О. Гончар «Мова наша, мова мова кольорова в ній гроза травнева, й тиша вечорова»
C# – повністю об’єктно-орієнтована мова. C# – повністю об’єктно-орієнтована мова iconМова це душа народу
Досвід людства упродовж тисячоліть переконливо доводить, що мова об’єднує народи в нації й змінює державу. Занепадає мова – зникає...

Додайте кнопку на своєму сайті:
dok.znaimo.com.ua


База даних захищена авторським правом ©dok.znaimo.com.ua 2013
звернутися до адміністрації
dok.znaimo.com.ua
Головна сторінка