410 likes | 612 Views
Курс по програмиране на C#. Занятие № 7 Свойства. Индексатори. Наследяване. Изключения. Съдържание 1/1. Свойства Индексатори Наследяване Изключения. Какво ще бъде изведено в конзолата?.
E N D
Курс по програмиране на C# Занятие №7Свойства. Индексатори. Наследяване. Изключения
Съдържание 1/1 • Свойства • Индексатори • Наследяване • Изключения
Какво ще бъде изведено в конзолата? classBook{privatestring _title;publicBook(string title) {_title = title; }}classProgram{staticvoid Main(string[] args) {Bookbook1 = newBook("The Hobbit");Bookbook2 = newBook("The Hobbit");Console.WriteLine(book1 == book2); }}
Къде е проблемът в кода? classPerson{publicstringFirstName;publicstringLastName;publicPerson(stringfirstName, stringlastName) {this.FirstName= firstName;this.LastName= lastName; }}
Къде е проблемът в кода? classInstitution{privatestring _name;privatestring _address;publicInstitution(string name) {_name = name; }publicInstitution(string address) {_address = address; }publicstringGetName() {return_name; }publicstringGetAddress() {return_address; }}
Къде е проблемът в кода? classAnimal{privatestaticint _animalCount;privatereadonlystring _species;staticAnimal(intinitialCount) {_animalCount = initialCount; }publicAnimal(string species) {this._animalCount++;_species = species; }}
Свойства • Какво е „свойство“? • Член, с който се борави, както с поле • Не се асоциира с част от паметта на обекта • Не съхранява характеристики на обекта, но може да служи за достъпването им • Тип данни и наименование • Уникалност на наименованието • Много удобно при капсулиране
Свойства • Деклариране на свойства • Тип данни • Наименование – съществително или фраза в Pascal case • Тяло – блок, съдържащ поне един от следните блокове: • Блок за четене – префиксира се със служебната дума get и задължително връща стойност • Блок за записване – префиксира се със служебната дума set и в него може да се използва служебната дума value за достъпване на присвоената стойност
Свойства classDog{privatestring _name;privatestring _breed;publicstring Name {get{ return _name; } }publicstring Breed {get{ return _breed; }set{ _breed = value; } }publicstring Description {get{ returnstring.Format("{0} is a {1}.", _name, _breed); } }}
Свойства • Пред блоковете за четене или записване може да бъдат поставени модификатори за достъп publicstring Name{get{ return _name; }protectedset { _name = value; }} • Позволява различни нива на видимост за двете операции
Свойства • Използване на свойства – аналогично с използването на полета Dog dog = newDog();dog.Breed = "poodle";Console.WriteLine(dog.Description);
Свойства • Автоматично генерирани свойства • Кодът в тялото им не се декларира от програмиста • Компилаторът създава служебно поле за съхранение на данните • Удобни за капсулиране на полета – всички полета трябва да са частни
Свойства • Деклариране на автоматично генерирани свойства • Вместо блокове за четене и записване се поставят само двете служебни думи get и set с точка и запетая след всяка от тях • Задължително трябва да присъстват и двете служебни думи • Могат да се използват модификатори за достъп classDog{publicstring Name { get; protectedset; }publicstring Breed { get; set; }}
Свойства • Статични свойства • Не са обвързани с конктрена инстанция на класа, а със самия клас • В блоковете за четене и записване не могат да се използват пряко нестатични членове на класа • Декларират се с ключовата дума static • Също могат да са автоматично генерирани
Свойства classAnimal{privatestaticint _animalCount = 0;publicstaticint AnimalCount {get{ return _animalCount; }set{ _animalCount = value; } }} // Използване на статично свойствоConsole.WriteLine(Animal.AnimalCount);
Индексатори • Какво е „индексатор“? • Член, служещ за презаписване на оператора за достъпване на индексиран елемент [] • Един или повече параметри; тип на връщания резултат • Повече от един индексатори с различни параметри • Няма статични индексатори
Индексатори • Деклариране на индексатори • Сходно с декларирането на свойства • Тип данни на индексирания елемент • Ключова дума this • Списък от един или повече параметри, заградени в квадратни скоби • Тяло – блок с блокове за четене и/или запис
Индексатори classDogs{privatereadonlyDog[] _dogs = newDog[50];publicDogthis[int index] {get{ return _dogs[index]; }set{ _dogs[index] = value; } }publicDogthis[string name] {get {foreach(Dog dog in _dogs) {if(dog != null && dog.Name == name)returndog; }returnnull; } }}
Индексатори • Използване на индексатори • Сходно с индексирането на елементите на масив • След променливата/израза се поставя списък от аргументи в квадратни скоби Dogs dogs = newDogs();dogs[0] = newDog("Lassie");Console.WriteLine(dogs["Lassie"].Description);
Наследяване • Какво е „наследяване“? • Друг от основните принципи на ООП • Един клас може да наследи друг (родителски) • Наследеният клас придобива всички членове на родителския • Наследеният клас може да декларира собствени членове • Част от членовете на родителския клас може да са недостъпни за наследения заради видимостта си • Множествено наследяване – в C# няма • Дървовидни йерархии от класове • Класът object – прародител на всички типове данни
Наследяване • Деклариране на наследен клас • Между наименованието на класа и тялото с декларации на членовете му се поставя двоеточие, следвано от наименованието на родителския клас classOrganism{}classAnimal : Organism{}
Наследяване • Конструктори на наследен клас • По подразбиране изпълняват конструктора без параметри на родителския клас • Може да се посочи кой конструктор на родителския клас да се изпълни – ключовата дума base и списък от аргументи преди тялото на конструктора
Наследяване classOrganism{privatereadonlybool _needsOxygen;publicOrganism(bool needsOxygen) { _needsOxygen = needsOxygen; }publicbool NeedsOxygen {get{ return _needsOxygen; } }}
Наследяване classAnimal : Organism{privatereadonlybool _isHerbivorous;publicAnimal(bool isHerbivorous) : base(true) { _isHerbivorous = isHerbivorous; }publicbool IsHerbivorous {get{ return _isHerbivorous; } }}
Наследяване classDog : Animal{privatereadonlystring _name;public Dog(string name) : base(false) { _name = name; }publicstring Name {get { return _name; } }}
Наследяване • Използване на наследени класове • Обектите от наследен клас съдържат членовете, декларирани в този клас, както и тези, декларирани в родителските класове нагоре по йерархията • Някои от тези членове може да са с ограничена видимост Dog dog = newDog("Bolt");if (dog.NeedsOxygen){Console.WriteLine("{0} needs oxygen to survive.", dog.Name);}
Наследяване • Какво е превръщане на типове нагоре по йерархията (upcasting)? • Променлива с тип данни родителски клас • Присвояваме израз с тип данни наследен клас • Обектите от наследения клас винаги са съвместими с родителския клас • Извършва се неявно Animal animal = newDog("Шаро");
Наследяване • Какво е превръщане на типове надолу по йерархията (downcasting)? • Променлива с тип данни наследен клас • Присвояваме израз с тип данни родителски клас • Грешка, ако обектът в паметта не е съместим с наследения клас (неговият тип данни трябва да съвпада с този наследен клас или да го наследява) • Извършва се явно Animal animal = newDog("Шаро");Dog dog = (Dog)animal;
Наследяване • Безопасно превръщане на типове • Операторът is • Връща true, когато типът на стойността на израза отляво съвпада с типа отдясно или го наследява if (animal isDog){Dog dog = (Dog)animal;// операции}
Наследяване • Безопасно превръщане на типове • Операторът as • Превръща типа на стойността отляво към типа отдясно, когато типовете са съвместими • Връща null, когато типовете не са съвместими • Не може да се използва за нереферентни типове Dog dog = animal asDog;if (dog != null){// операции}
Изключения • Какво е „изключение“? • Обект • Сигнализира за проблем в изпълнението на програмата (изключителна ситуация) • Съдържа информация за вида на проблема и състоянието на програмата при възникването му • Прекратява се изпълнението на текущия код • Търси се блок за обработка на изключения, който да го обработи • Ако не бъде обработено, преустановява се изпълнението на програмата с грешка
Изключения • Блокове за обработка на изключения • Предоставят механизъм за обработка на изключения • Операции, възникналите изключения в които да бъдат обработени • Операции за обработка на изключения • Операции, които да бъдат изпълнени независимо от възникването на изключения
Изключения • Изключения в C# • Базов клас за всички изключения – Exception • Вградени класове за изключения, например ArgumentException, IndexOutOfRangeException и IOException • Декларирани от програмиста класове за изключения – наименованията им завършват с Exception
Изключения • Класът Exception • Message – съобщение за проблема в свободен текст • StackTrace– състояние на стека от извиквания на функции при възникването на изключението • InnerException– вложено изключение
Изключения • Предизвикване на изключения • Ключовата дума throw • Израз от тип за изключение
Изключения classDog{privatereadonlystring _name;public Dog(string name) {if (string.IsNullOrEmpty(name)){thrownewArgumentException("Every self-respecting dog should have a name.");} _name = name; }publicstring Name {get{ return _name; } }}
Изключения • Обработка на изключения – try...catch... finally блокове try{// Операции}catch (ArgumentException ex){// Обработване на ArgumentException}catch (Exception ex){// Обработване на Exception}finally{// Операции, които да винаги ще бъдат изпълнени}
Изключения • Възможно е при обработката на изключение да се предизвика друго изключение, както и да се предизвика същото отново Organism organism = newOrganism(true);try{Animalanimal = (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/