1 / 41

Курс по програмиране на C#

Курс по програмиране на C#. Занятие № 7 Свойства. Индексатори. Наследяване. Изключения. Съдържание 1/1. Свойства Индексатори Наследяване Изключения. Какво ще бъде изведено в конзолата?.

adelie
Télécharger la présentation

Курс по програмиране на C#

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Съдържание 1/1 • Свойства • Индексатори • Наследяване • Изключения

  3. Какво ще бъде изведено в конзолата? 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); }}

  4. Къде е проблемът в кода? classPerson{publicstringFirstName;publicstringLastName;publicPerson(stringfirstName, stringlastName) {this.FirstName= firstName;this.LastName= lastName; }}

  5. Къде е проблемът в кода? classInstitution{privatestring _name;privatestring _address;publicInstitution(string name) {_name = name; }publicInstitution(string address) {_address = address; }publicstringGetName() {return_name; }publicstringGetAddress() {return_address; }}

  6. Къде е проблемът в кода? classAnimal{privatestaticint _animalCount;privatereadonlystring _species;staticAnimal(intinitialCount) {_animalCount = initialCount; }publicAnimal(string species) {this._animalCount++;_species = species; }}

  7. Свойства • Какво е „свойство“? • Член, с който се борави, както с поле • Не се асоциира с част от паметта на обекта • Не съхранява характеристики на обекта, но може да служи за достъпването им • Тип данни и наименование • Уникалност на наименованието • Много удобно при капсулиране

  8. Свойства • Деклариране на свойства • Тип данни • Наименование – съществително или фраза в Pascal case • Тяло – блок, съдържащ поне един от следните блокове: • Блок за четене – префиксира се със служебната дума get и задължително връща стойност • Блок за записване – префиксира се със служебната дума set и в него може да се използва служебната дума value за достъпване на присвоената стойност

  9. Свойства 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); } }}

  10. Свойства • Пред блоковете за четене или записване може да бъдат поставени модификатори за достъп publicstring Name{get{ return _name; }protectedset { _name = value; }} • Позволява различни нива на видимост за двете операции

  11. Свойства • Използване на свойства – аналогично с използването на полета Dog dog = newDog();dog.Breed = "poodle";Console.WriteLine(dog.Description);

  12. Свойства • Автоматично генерирани свойства • Кодът в тялото им не се декларира от програмиста • Компилаторът създава служебно поле за съхранение на данните • Удобни за капсулиране на полета – всички полета трябва да са частни

  13. Свойства • Деклариране на автоматично генерирани свойства • Вместо блокове за четене и записване се поставят само двете служебни думи get и set с точка и запетая след всяка от тях • Задължително трябва да присъстват и двете служебни думи • Могат да се използват модификатори за достъп classDog{publicstring Name { get; protectedset; }publicstring Breed { get; set; }}

  14. Свойства • Статични свойства • Не са обвързани с конктрена инстанция на класа, а със самия клас • В блоковете за четене и записване не могат да се използват пряко нестатични членове на класа • Декларират се с ключовата дума static • Също могат да са автоматично генерирани

  15. Свойства classAnimal{privatestaticint _animalCount = 0;publicstaticint AnimalCount {get{ return _animalCount; }set{ _animalCount = value; } }} // Използване на статично свойствоConsole.WriteLine(Animal.AnimalCount);

  16. Индексатори • Какво е „индексатор“? • Член, служещ за презаписване на оператора за достъпване на индексиран елемент [] • Един или повече параметри; тип на връщания резултат • Повече от един индексатори с различни параметри • Няма статични индексатори

  17. Индексатори • Деклариране на индексатори • Сходно с декларирането на свойства • Тип данни на индексирания елемент • Ключова дума this • Списък от един или повече параметри, заградени в квадратни скоби • Тяло – блок с блокове за четене и/или запис

  18. Индексатори 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; } }}

  19. Индексатори • Използване на индексатори • Сходно с индексирането на елементите на масив • След променливата/израза се поставя списък от аргументи в квадратни скоби Dogs dogs = newDogs();dogs[0] = newDog("Lassie");Console.WriteLine(dogs["Lassie"].Description);

  20. Наследяване • Какво е „наследяване“? • Друг от основните принципи на ООП • Един клас може да наследи друг (родителски) • Наследеният клас придобива всички членове на родителския • Наследеният клас може да декларира собствени членове • Част от членовете на родителския клас може да са недостъпни за наследения заради видимостта си • Множествено наследяване – в C# няма • Дървовидни йерархии от класове • Класът object – прародител на всички типове данни

  21. Наследяване • Деклариране на наследен клас • Между наименованието на класа и тялото с декларации на членовете му се поставя двоеточие, следвано от наименованието на родителския клас classOrganism{}classAnimal : Organism{}

  22. Наследяване • Конструктори на наследен клас • По подразбиране изпълняват конструктора без параметри на родителския клас • Може да се посочи кой конструктор на родителския клас да се изпълни – ключовата дума base и списък от аргументи преди тялото на конструктора

  23. Наследяване classOrganism{privatereadonlybool _needsOxygen;publicOrganism(bool needsOxygen) { _needsOxygen = needsOxygen; }publicbool NeedsOxygen {get{ return _needsOxygen; } }}

  24. Наследяване classAnimal : Organism{privatereadonlybool _isHerbivorous;publicAnimal(bool isHerbivorous) : base(true) { _isHerbivorous = isHerbivorous; }publicbool IsHerbivorous {get{ return _isHerbivorous; } }}

  25. Наследяване classDog : Animal{privatereadonlystring _name;public Dog(string name) : base(false) { _name = name; }publicstring Name {get { return _name; } }}

  26. Наследяване • Използване на наследени класове • Обектите от наследен клас съдържат членовете, декларирани в този клас, както и тези, декларирани в родителските класове нагоре по йерархията • Някои от тези членове може да са с ограничена видимост Dog dog = newDog("Bolt");if (dog.NeedsOxygen){Console.WriteLine("{0} needs oxygen to survive.", dog.Name);}

  27. Наследяване • Какво е превръщане на типове нагоре по йерархията (upcasting)? • Променлива с тип данни родителски клас • Присвояваме израз с тип данни наследен клас • Обектите от наследения клас винаги са съвместими с родителския клас • Извършва се неявно Animal animal = newDog("Шаро");

  28. Наследяване • Какво е превръщане на типове надолу по йерархията (downcasting)? • Променлива с тип данни наследен клас • Присвояваме израз с тип данни родителски клас • Грешка, ако обектът в паметта не е съместим с наследения клас (неговият тип данни трябва да съвпада с този наследен клас или да го наследява) • Извършва се явно Animal animal = newDog("Шаро");Dog dog = (Dog)animal;

  29. Наследяване • Безопасно превръщане на типове • Операторът is • Връща true, когато типът на стойността на израза отляво съвпада с типа отдясно или го наследява if (animal isDog){Dog dog = (Dog)animal;// операции}

  30. Наследяване • Безопасно превръщане на типове • Операторът as • Превръща типа на стойността отляво към типа отдясно, когато типовете са съвместими • Връща null, когато типовете не са съвместими • Не може да се използва за нереферентни типове Dog dog = animal asDog;if (dog != null){// операции}

  31. Изключения • Какво е „изключение“? • Обект • Сигнализира за проблем в изпълнението на програмата (изключителна ситуация) • Съдържа информация за вида на проблема и състоянието на програмата при възникването му • Прекратява се изпълнението на текущия код • Търси се блок за обработка на изключения, който да го обработи • Ако не бъде обработено, преустановява се изпълнението на програмата с грешка

  32. Изключения • Блокове за обработка на изключения • Предоставят механизъм за обработка на изключения • Операции, възникналите изключения в които да бъдат обработени • Операции за обработка на изключения • Операции, които да бъдат изпълнени независимо от възникването на изключения

  33. Изключения • Изключения в C# • Базов клас за всички изключения – Exception • Вградени класове за изключения, например ArgumentException, IndexOutOfRangeException и IOException • Декларирани от програмиста класове за изключения – наименованията им завършват с Exception

  34. Изключения • Класът Exception • Message – съобщение за проблема в свободен текст • StackTrace– състояние на стека от извиквания на функции при възникването на изключението • InnerException– вложено изключение

  35. Изключения • Предизвикване на изключения • Ключовата дума throw • Израз от тип за изключение

  36. Изключения 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; } }}

  37. Изключения • Обработка на изключения – try...catch... finally блокове try{// Операции}catch (ArgumentException ex){// Обработване на ArgumentException}catch (Exception ex){// Обработване на Exception}finally{// Операции, които да винаги ще бъдат изпълнени}

  38. Изключения • Възможно е при обработката на изключение да се предизвика друго изключение, както и да се предизвика същото отново Organism organism = newOrganism(true);try{Animalanimal = (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();}

  40. Въпроси?

  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/

More Related