SlideShare a Scribd company logo
Курс по програмиране на
C#
Занятие №7
Свойства. Индексатори.
Наследяване. Изключения

2013
Съдържание 1/1
•
•
•
•

Свойства
Индексатори
Наследяване
Изключения
Какво ще бъде изведено в конзолата?
class Book
{
private string _title;
public Book(string title)
{
_title = title;
}
}
class Program
{
static void Main(string[] args)
{
Book book1 = new Book("The Hobbit");
Book book2 = new Book("The Hobbit");
Console.WriteLine(book1 == book2);
}
}
Къде е проблемът в кода?
class Person
{
public string FirstName;
public string LastName;
public Person(string firstName, string lastName)
{
this.FirstName = firstName;
this.LastName = lastName;
}
}
Къде е проблемът в кода?
class Institution
{
private string _name;
private string _address;
public Institution(string name)
{
_name = name;
}
public Institution(string address)
{
_address = address;
}
public string GetName()
{
return _name;
}
public string GetAddress()
{
return _address;
}
}
Къде е проблемът в кода?
class Animal
{
private static int _animalCount;
private readonly string _species;
static Animal(int initialCount)
{
_animalCount = initialCount;
}

public Animal(string species)
{
this._animalCount++;
_species = species;
}
}
Свойства
• Какво е „свойство“?
– Член, с който се борави, както с поле
– Не се асоциира с част от паметта на обекта
– Не съхранява характеристики на обекта, но може да
служи за достъпването им
– Тип данни и наименование
– Уникалност на наименованието
– Много удобно при капсулиране
Свойства
• Деклариране на свойства
– Тип данни
– Наименование – съществително или фраза в Pascal
case
– Тяло – блок, съдържащ поне един от следните
блокове:
• Блок за четене – префиксира се със служебната дума get и
задължително връща стойност
• Блок за записване – префиксира се със служебната дума set
и в него може да се използва служебната дума value за
достъпване на присвоената стойност
Свойства
class Dog
{
private string _name;
private string _breed;
public string Name
{
get { return _name; }
}
public string Breed
{
get { return _breed; }
set { _breed = value; }
}
public string Description
{
get { return string.Format("{0} is a {1}.", _name, _breed); }
}

}
Свойства
• Пред блоковете за четене или записване може
да бъдат поставени модификатори за достъп
public string Name
{
get { return _name; }
protected set { _name = value; }
}

• Позволява различни нива на видимост за двете
операции
Свойства
• Използване на свойства – аналогично с
използването на полета
Dog dog = new Dog();
dog.Breed = "poodle";
Console.WriteLine(dog.Description);
Свойства
• Автоматично генерирани свойства
– Кодът в тялото им не се декларира от програмиста
– Компилаторът създава служебно поле за съхранение
на данните
– Удобни за капсулиране на полета – всички полета
трябва да са частни
Свойства
• Деклариране на автоматично генерирани
свойства
– Вместо блокове за четене и записване се поставят
само двете служебни думи get и set с точка и запетая
след всяка от тях
– Задължително трябва да присъстват и двете служебни
думи
– Могат да се използват модификатори за достъп
class Dog
{
public string Name { get; protected set; }

public string Breed { get; set; }
}
Свойства
• Статични свойства
– Не са обвързани с конктрена инстанция на класа, а
със самия клас
– В блоковете за четене и записване не могат да се
използват пряко нестатични членове на класа
– Декларират се с ключовата дума static
– Също могат да са автоматично генерирани
Свойства
class Animal
{
private static int _animalCount = 0;

public static int AnimalCount
{
get { return _animalCount; }
set { _animalCount = value; }
}
}
// Използване на статично свойство
Console.WriteLine(Animal.AnimalCount);
Индексатори
• Какво е „индексатор“?
– Член, служещ за презаписване на оператора за
достъпване на индексиран елемент []
– Един или повече параметри; тип на връщания
резултат
– Повече от един индексатори с различни параметри
– Няма статични индексатори
Индексатори
• Деклариране на индексатори
Сходно с декларирането на свойства
Тип данни на индексирания елемент
Ключова дума this
Списък от един или повече параметри, заградени в
квадратни скоби
– Тяло – блок с блокове за четене и/или запис
–
–
–
–
Индексатори
class Dogs
{
private readonly Dog[] _dogs = new Dog[50];
public Dog this[int index]
{
get { return _dogs[index]; }
set { _dogs[index] = value; }
}
public Dog this[string name]
{
get
{
foreach (Dog dog in _dogs)
{
if (dog != null && dog.Name == name)
return dog;
}
return null;
}
}
}
Индексатори
• Използване на индексатори
– Сходно с индексирането на елементите на масив
– След променливата/израза се поставя списък от
аргументи в квадратни скоби
Dogs dogs = new Dogs();
dogs[0] = new Dog("Lassie");
Console.WriteLine(dogs["Lassie"].Description);
Наследяване
• Какво е „наследяване“?
– Друг от основните принципи на ООП
– Един клас може да наследи друг (родителски)
– Наследеният клас придобива всички членове на
родителския
– Наследеният клас може да декларира собствени
членове
– Част от членовете на родителския клас може да са
недостъпни за наследения заради видимостта си
– Множествено наследяване – в C# няма
– Дървовидни йерархии от класове
– Класът object – прародител на всички типове данни
Наследяване
• Деклариране на наследен клас
– Между наименованието на класа и тялото с
декларации на членовете му се поставя
двоеточие, следвано от наименованието на
родителския клас
class Organism
{
}
class Animal : Organism
{
}
Наследяване
• Конструктори на наследен клас
– По подразбиране изпълняват конструктора без
параметри на родителския клас
– Може да се посочи кой конструктор на родителския
клас да се изпълни – ключовата дума base и списък от
аргументи преди тялото на конструктора
Наследяване
class Organism
{
private readonly bool _needsOxygen;
public Organism(bool needsOxygen)
{
_needsOxygen = needsOxygen;
}
public bool NeedsOxygen
{
get { return _needsOxygen; }
}
}
Наследяване
class Animal : Organism
{
private readonly bool _isHerbivorous;
public Animal(bool isHerbivorous)
: base(true)
{
_isHerbivorous = isHerbivorous;
}
public bool IsHerbivorous
{
get { return _isHerbivorous; }
}
}
Наследяване
class Dog : Animal
{
private readonly string _name;
public Dog(string name)
: base(false)
{
_name = name;
}
public string Name
{
get { return _name; }
}
}
Наследяване
• Използване на наследени класове
– Обектите от наследен клас съдържат членовете,
декларирани в този клас, както и тези, декларирани в
родителските класове нагоре по йерархията
– Някои от тези членове може да са с ограничена
видимост
Dog dog = new Dog("Bolt");
if (dog.NeedsOxygen)
{
Console.WriteLine(
"{0} needs oxygen to survive.", dog.Name);
}
Наследяване
• Какво е превръщане на типове нагоре по
йерархията (upcasting)?
– Променлива с тип данни родителски клас
– Присвояваме израз с тип данни наследен клас
– Обектите от наследения клас винаги са съвместими с
родителския клас
– Извършва се неявно
Animal animal = new Dog("Шаро");
Наследяване
• Какво е превръщане на типове надолу по
йерархията (downcasting)?
– Променлива с тип данни наследен клас
– Присвояваме израз с тип данни родителски клас
– Грешка, ако обектът в паметта не е съместим с
наследения клас (неговият тип данни трябва да
съвпада с този наследен клас или да го наследява)
– Извършва се явно
Animal animal = new Dog("Шаро");
Dog dog = (Dog)animal;
Наследяване
• Безопасно превръщане на типове
– Операторът is
– Връща true, когато типът на стойността на израза
отляво съвпада с типа отдясно или го наследява
if (animal is Dog)
{
Dog dog = (Dog)animal;
// операции
}
Наследяване
• Безопасно превръщане на типове
– Операторът as
– Превръща типа на стойността отляво към типа
отдясно, когато типовете са съвместими
– Връща null, когато типовете не са съвместими
– Не може да се използва за нереферентни типове
Dog dog = animal as Dog;
if (dog != null)
{
// операции
}
Изключения
• Какво е „изключение“?
– Обект
– Сигнализира за проблем в изпълнението на
програмата (изключителна ситуация)
– Съдържа информация за вида на проблема и
състоянието на програмата при възникването му
– Прекратява се изпълнението на текущия код
– Търси се блок за обработка на изключения, който да
го обработи
– Ако не бъде обработено, преустановява се
изпълнението на програмата с грешка
Изключения
• Блокове за обработка на изключения
– Предоставят механизъм за обработка на изключения
– Операции, възникналите изключения в които да бъдат
обработени
– Операции за обработка на изключения
– Операции, които да бъдат изпълнени независимо от
възникването на изключения
Изключения
• Изключения в C#
– Базов клас за всички изключения – Exception
– Вградени класове за изключения, например
ArgumentException, IndexOutOfRangeException и
IOException
– Декларирани от програмиста класове за изключения
– наименованията им завършват с Exception
Изключения
• Класът Exception
– Message – съобщение за проблема в свободен текст
– StackTrace – състояние на стека от извиквания на
функции при възникването на изключението
– InnerException – вложено изключение
Изключения
• Предизвикване на изключения
– Ключовата дума throw
– Израз от тип за изключение
Изключения
class Dog
{
private readonly string _name;
public Dog(string name)
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentException(
"Every self-respecting dog should have a name.");
}
_name = name;
}
public string Name
{
get { return _name; }
}
}
Изключения
• Обработка на изключения – try...catch...
finally блокове
try
{

// Операции
}
catch (ArgumentException ex)
{
// Обработване на ArgumentException
}
catch (Exception ex)
{
// Обработване на Exception
}
finally
{
// Операции, които да винаги ще бъдат изпълнени
}
Изключения
• Възможно е при обработката на изключение да
се предизвика друго изключение, както и да се
предизвика същото отново
Organism organism = new Organism(true);
try
{
Animal animal = (Animal)organism;
}
catch (InvalidCastException ex)
{
Console.WriteLine("The organism is not an animal.");
throw;
}
Изключения
• Задължително изпълняване на операции,
независимо от възникването на изключения
FileStream fileStream = File.OpenRead(@"C:File.txt");
try
{
// Операции
}
finally
{
fileStream.Close();
}
Въпроси?
Благодаря!
• Александър Далемски
–
–
–
–

sasho@david.bg
musashi.bg@gmail.com
Skype: musasho
https://www.facebook.com/adalemski

• ДАВИД академия
–
–
–
–

acad@david.bg
http://acad.david.bg/
@david_academy
https://www.facebook.com/groups/david.academy/

More Related Content

PPTX
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
PPTX
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №7
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №14
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №8
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №11
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №10
PPTX
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Училищен курс по програмиране на C# (2013/2014), занятие №7
Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №11
Училищен курс по програмиране на C# (2013/2014), занятие №10
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)

What's hot (15)

PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №9
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №4
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №13
PPTX
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
PPT
JDK 1.5 New Features
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №12
PPTX
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
PPTX
Курс по програмиране на C# 2013 - 2. Конзолен вход и изход. Условни преходи. ...
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №3
PPTX
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №2
PPTX
Курс по уеб програмиране (2015), занятие №2 - CSS
PDF
Скаларни типове данни
PPTX
Курс по уеб програмиране (2015), занятие №1 - HTML
PPTX
Курс по уеб програмиране (2014), занятие №2 - CSS
Училищен курс по програмиране на C# (2013/2014), занятие №9
Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №13
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
JDK 1.5 New Features
Училищен курс по програмиране на C# (2013/2014), занятие №12
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
Курс по програмиране на C# 2013 - 2. Конзолен вход и изход. Условни преходи. ...
Училищен курс по програмиране на C# (2013/2014), занятие №3
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Училищен курс по програмиране на C# (2013/2014), занятие №2
Курс по уеб програмиране (2015), занятие №2 - CSS
Скаларни типове данни
Курс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №2 - CSS
Ad

Viewers also liked (18)

DOCX
Курс по програмиране за напреднали (2012) - 3. Бази данни. Системи за управле...
PPTX
Ecommerce SEO - Lily Grozeva
PPTX
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
PPTX
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
PDF
SEO курс, лекция 12 - Статистики и измерване
PDF
SEO курс 2014, лекция 9 - Линк бейт, който носи линкове, част 1
PPTX
Курс по програмиране за напреднали (2012) - 8. Софтуерни проекти. Софтуерни и...
PDF
SEO курс, лекция 11 - От заявка до рендиране
PDF
SEO курс 2014, лекция 10 - Линк бейт, който носи линкове, част 2
PDF
SEO курс 2014, лекция 7 - Анализ на конкуренцията
PDF
SEO курс 2014, лекция 4: Техническа оптимизация, част 2
PDF
SEO курс, лекция 5 - Анализ на ключови думи
PDF
SEO курс 2014, лекция 8 - Линк анализ
PPTX
Училищен курс по програмиране на C# (2013/2014), занятие №1
PDF
SEO курс 2014, лекция 3: Техническа оптимизация, част 1
PDF
SEO курс 2014, лекция 2 - Onpage оптимизация
PDF
SEO курс 2014, лекция 6 - Информационна архитектура
PDF
SEO курс, лекция 13 - SEO инструментариум
Курс по програмиране за напреднали (2012) - 3. Бази данни. Системи за управле...
Ecommerce SEO - Lily Grozeva
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
SEO курс, лекция 12 - Статистики и измерване
SEO курс 2014, лекция 9 - Линк бейт, който носи линкове, част 1
Курс по програмиране за напреднали (2012) - 8. Софтуерни проекти. Софтуерни и...
SEO курс, лекция 11 - От заявка до рендиране
SEO курс 2014, лекция 10 - Линк бейт, който носи линкове, част 2
SEO курс 2014, лекция 7 - Анализ на конкуренцията
SEO курс 2014, лекция 4: Техническа оптимизация, част 2
SEO курс, лекция 5 - Анализ на ключови думи
SEO курс 2014, лекция 8 - Линк анализ
Училищен курс по програмиране на C# (2013/2014), занятие №1
SEO курс 2014, лекция 3: Техническа оптимизация, част 1
SEO курс 2014, лекция 2 - Onpage оптимизация
SEO курс 2014, лекция 6 - Информационна архитектура
SEO курс, лекция 13 - SEO инструментариум
Ad

Similar to Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изключения (20)

PPTX
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
PDF
Presentation on SOLID design principles
PPTX
.NET/C#_8
PPT
Introduction To Object Oriented Design and UML
PPTX
Курс по програмиране за напреднали (2012) - 9. Добър и лош код. Преработка и ...
PPTX
Основни структури за управление на изчислителния процес
PPTX
Информационни системи - упражнение № 1
PPTX
Динамична памет (оператори new и delete) в C++
DOC
Introduction to Programming with C# Book - книга за C# програмиране
PPT
Svetlin Nakov - .NET Framework Overview
PDF
Writing SOLID Code
PDF
Oop lab-10шаблонни
PPTX
.NET/C#_4
PPT
High Quality Code Introduction
PPT
Nakov High Quality Code
PPT
Nakov - .NET Framework Overview + Security
PPTX
.NET/C#_3
PPTX
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
DOC
Rykowodstwo po programirane_na_bazata_na_ezika_java
PPTX
.NET/C#_9
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
Presentation on SOLID design principles
.NET/C#_8
Introduction To Object Oriented Design and UML
Курс по програмиране за напреднали (2012) - 9. Добър и лош код. Преработка и ...
Основни структури за управление на изчислителния процес
Информационни системи - упражнение № 1
Динамична памет (оператори new и delete) в C++
Introduction to Programming with C# Book - книга за C# програмиране
Svetlin Nakov - .NET Framework Overview
Writing SOLID Code
Oop lab-10шаблонни
.NET/C#_4
High Quality Code Introduction
Nakov High Quality Code
Nakov - .NET Framework Overview + Security
.NET/C#_3
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
Rykowodstwo po programirane_na_bazata_na_ezika_java
.NET/C#_9

More from DAVID Academy (10)

PPTX
Курс по уеб програмиране (2014), занятие №1 - HTML
DOCX
Училищен курс по програмиране на C# (2013/2014) - Помагало
DOCX
Училищен курс по програмиране на C# (2013/2014) - Упражнения
PPTX
Курс по информационни технологии (2013) - 5. HTTP & Web Services
PPTX
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
PPTX
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
PPTX
Курс по информационни технологии (2013) - 0. Представяне
DOCX
Курс по информационни технологии (2013) - Помагало
DOCX
Курс по програмиране на C# (2013) - Упражнения
PPTX
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции
Курс по уеб програмиране (2014), занятие №1 - HTML
Училищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - Упражнения
Курс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 0. Представяне
Курс по информационни технологии (2013) - Помагало
Курс по програмиране на C# (2013) - Упражнения
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции

Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изключения

  • 1. Курс по програмиране на C# Занятие №7 Свойства. Индексатори. Наследяване. Изключения 2013
  • 3. Какво ще бъде изведено в конзолата? class Book { private string _title; public Book(string title) { _title = title; } } class Program { static void Main(string[] args) { Book book1 = new Book("The Hobbit"); Book book2 = new Book("The Hobbit"); Console.WriteLine(book1 == book2); } }
  • 4. Къде е проблемът в кода? class Person { public string FirstName; public string LastName; public Person(string firstName, string lastName) { this.FirstName = firstName; this.LastName = lastName; } }
  • 5. Къде е проблемът в кода? class Institution { private string _name; private string _address; public Institution(string name) { _name = name; } public Institution(string address) { _address = address; } public string GetName() { return _name; } public string GetAddress() { return _address; } }
  • 6. Къде е проблемът в кода? class Animal { private static int _animalCount; private readonly string _species; static Animal(int initialCount) { _animalCount = initialCount; } public Animal(string species) { this._animalCount++; _species = species; } }
  • 7. Свойства • Какво е „свойство“? – Член, с който се борави, както с поле – Не се асоциира с част от паметта на обекта – Не съхранява характеристики на обекта, но може да служи за достъпването им – Тип данни и наименование – Уникалност на наименованието – Много удобно при капсулиране
  • 8. Свойства • Деклариране на свойства – Тип данни – Наименование – съществително или фраза в Pascal case – Тяло – блок, съдържащ поне един от следните блокове: • Блок за четене – префиксира се със служебната дума get и задължително връща стойност • Блок за записване – префиксира се със служебната дума set и в него може да се използва служебната дума value за достъпване на присвоената стойност
  • 9. Свойства class Dog { private string _name; private string _breed; public string Name { get { return _name; } } public string Breed { get { return _breed; } set { _breed = value; } } public string Description { get { return string.Format("{0} is a {1}.", _name, _breed); } } }
  • 10. Свойства • Пред блоковете за четене или записване може да бъдат поставени модификатори за достъп public string Name { get { return _name; } protected set { _name = value; } } • Позволява различни нива на видимост за двете операции
  • 11. Свойства • Използване на свойства – аналогично с използването на полета Dog dog = new Dog(); dog.Breed = "poodle"; Console.WriteLine(dog.Description);
  • 12. Свойства • Автоматично генерирани свойства – Кодът в тялото им не се декларира от програмиста – Компилаторът създава служебно поле за съхранение на данните – Удобни за капсулиране на полета – всички полета трябва да са частни
  • 13. Свойства • Деклариране на автоматично генерирани свойства – Вместо блокове за четене и записване се поставят само двете служебни думи get и set с точка и запетая след всяка от тях – Задължително трябва да присъстват и двете служебни думи – Могат да се използват модификатори за достъп class Dog { public string Name { get; protected set; } public string Breed { get; set; } }
  • 14. Свойства • Статични свойства – Не са обвързани с конктрена инстанция на класа, а със самия клас – В блоковете за четене и записване не могат да се използват пряко нестатични членове на класа – Декларират се с ключовата дума static – Също могат да са автоматично генерирани
  • 15. Свойства class Animal { private static int _animalCount = 0; public static int AnimalCount { get { return _animalCount; } set { _animalCount = value; } } } // Използване на статично свойство Console.WriteLine(Animal.AnimalCount);
  • 16. Индексатори • Какво е „индексатор“? – Член, служещ за презаписване на оператора за достъпване на индексиран елемент [] – Един или повече параметри; тип на връщания резултат – Повече от един индексатори с различни параметри – Няма статични индексатори
  • 17. Индексатори • Деклариране на индексатори Сходно с декларирането на свойства Тип данни на индексирания елемент Ключова дума this Списък от един или повече параметри, заградени в квадратни скоби – Тяло – блок с блокове за четене и/или запис – – – –
  • 18. Индексатори class Dogs { private readonly Dog[] _dogs = new Dog[50]; public Dog this[int index] { get { return _dogs[index]; } set { _dogs[index] = value; } } public Dog this[string name] { get { foreach (Dog dog in _dogs) { if (dog != null && dog.Name == name) return dog; } return null; } } }
  • 19. Индексатори • Използване на индексатори – Сходно с индексирането на елементите на масив – След променливата/израза се поставя списък от аргументи в квадратни скоби Dogs dogs = new Dogs(); dogs[0] = new Dog("Lassie"); Console.WriteLine(dogs["Lassie"].Description);
  • 20. Наследяване • Какво е „наследяване“? – Друг от основните принципи на ООП – Един клас може да наследи друг (родителски) – Наследеният клас придобива всички членове на родителския – Наследеният клас може да декларира собствени членове – Част от членовете на родителския клас може да са недостъпни за наследения заради видимостта си – Множествено наследяване – в C# няма – Дървовидни йерархии от класове – Класът object – прародител на всички типове данни
  • 21. Наследяване • Деклариране на наследен клас – Между наименованието на класа и тялото с декларации на членовете му се поставя двоеточие, следвано от наименованието на родителския клас class Organism { } class Animal : Organism { }
  • 22. Наследяване • Конструктори на наследен клас – По подразбиране изпълняват конструктора без параметри на родителския клас – Може да се посочи кой конструктор на родителския клас да се изпълни – ключовата дума base и списък от аргументи преди тялото на конструктора
  • 23. Наследяване class Organism { private readonly bool _needsOxygen; public Organism(bool needsOxygen) { _needsOxygen = needsOxygen; } public bool NeedsOxygen { get { return _needsOxygen; } } }
  • 24. Наследяване class Animal : Organism { private readonly bool _isHerbivorous; public Animal(bool isHerbivorous) : base(true) { _isHerbivorous = isHerbivorous; } public bool IsHerbivorous { get { return _isHerbivorous; } } }
  • 25. Наследяване class Dog : Animal { private readonly string _name; public Dog(string name) : base(false) { _name = name; } public string Name { get { return _name; } } }
  • 26. Наследяване • Използване на наследени класове – Обектите от наследен клас съдържат членовете, декларирани в този клас, както и тези, декларирани в родителските класове нагоре по йерархията – Някои от тези членове може да са с ограничена видимост Dog dog = new Dog("Bolt"); if (dog.NeedsOxygen) { Console.WriteLine( "{0} needs oxygen to survive.", dog.Name); }
  • 27. Наследяване • Какво е превръщане на типове нагоре по йерархията (upcasting)? – Променлива с тип данни родителски клас – Присвояваме израз с тип данни наследен клас – Обектите от наследения клас винаги са съвместими с родителския клас – Извършва се неявно Animal animal = new Dog("Шаро");
  • 28. Наследяване • Какво е превръщане на типове надолу по йерархията (downcasting)? – Променлива с тип данни наследен клас – Присвояваме израз с тип данни родителски клас – Грешка, ако обектът в паметта не е съместим с наследения клас (неговият тип данни трябва да съвпада с този наследен клас или да го наследява) – Извършва се явно Animal animal = new Dog("Шаро"); Dog dog = (Dog)animal;
  • 29. Наследяване • Безопасно превръщане на типове – Операторът is – Връща true, когато типът на стойността на израза отляво съвпада с типа отдясно или го наследява if (animal is Dog) { Dog dog = (Dog)animal; // операции }
  • 30. Наследяване • Безопасно превръщане на типове – Операторът as – Превръща типа на стойността отляво към типа отдясно, когато типовете са съвместими – Връща null, когато типовете не са съвместими – Не може да се използва за нереферентни типове Dog dog = animal as Dog; if (dog != null) { // операции }
  • 31. Изключения • Какво е „изключение“? – Обект – Сигнализира за проблем в изпълнението на програмата (изключителна ситуация) – Съдържа информация за вида на проблема и състоянието на програмата при възникването му – Прекратява се изпълнението на текущия код – Търси се блок за обработка на изключения, който да го обработи – Ако не бъде обработено, преустановява се изпълнението на програмата с грешка
  • 32. Изключения • Блокове за обработка на изключения – Предоставят механизъм за обработка на изключения – Операции, възникналите изключения в които да бъдат обработени – Операции за обработка на изключения – Операции, които да бъдат изпълнени независимо от възникването на изключения
  • 33. Изключения • Изключения в C# – Базов клас за всички изключения – Exception – Вградени класове за изключения, например ArgumentException, IndexOutOfRangeException и IOException – Декларирани от програмиста класове за изключения – наименованията им завършват с Exception
  • 34. Изключения • Класът Exception – Message – съобщение за проблема в свободен текст – StackTrace – състояние на стека от извиквания на функции при възникването на изключението – InnerException – вложено изключение
  • 35. Изключения • Предизвикване на изключения – Ключовата дума throw – Израз от тип за изключение
  • 36. Изключения class Dog { private readonly string _name; public Dog(string name) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException( "Every self-respecting dog should have a name."); } _name = name; } public string Name { get { return _name; } } }
  • 37. Изключения • Обработка на изключения – try...catch... finally блокове try { // Операции } catch (ArgumentException ex) { // Обработване на ArgumentException } catch (Exception ex) { // Обработване на Exception } finally { // Операции, които да винаги ще бъдат изпълнени }
  • 38. Изключения • Възможно е при обработката на изключение да се предизвика друго изключение, както и да се предизвика същото отново Organism organism = new Organism(true); try { Animal animal = (Animal)organism; } catch (InvalidCastException ex) { Console.WriteLine("The organism is not an animal."); throw; }
  • 39. Изключения • Задължително изпълняване на операции, независимо от възникването на изключения FileStream fileStream = File.OpenRead(@"C:File.txt"); try { // Операции } finally { fileStream.Close(); }
  • 41. Благодаря! • Александър Далемски – – – – sasho@david.bg musashi.bg@gmail.com Skype: musasho https://www.facebook.com/adalemski • ДАВИД академия – – – – acad@david.bg http://acad.david.bg/ @david_academy https://www.facebook.com/groups/david.academy/