125

Обектно-ориентирано програмиране в .NET

  • Upload
    lilli

  • View
    84

  • Download
    7

Embed Size (px)

DESCRIPTION

Програмиране за .NET Framework. http:// www.nakov.com / dotnet /. Обектно-ориентирано програмиране в .NET. Светлин Наков. Национална академия по разработка на софтуер. academy.devbg.org. Необходими знания. Добро познаване на принципите на обектно-ориентираното програмиране - PowerPoint PPT Presentation

Citation preview

Page 1: Обектно-ориентирано програмиране в  .NET
Page 2: Обектно-ориентирано програмиране в  .NET

Обектно-ориентираноОбектно-ориентиранопрограмиране в програмиране в .NET.NET

Програмиране заПрограмиране за .NET Framework .NET Frameworkhttp://http://www.nakov.comwww.nakov.com//dotnetdotnet//

Светлин НаковСветлин НаковНационална академия по Национална академия по разработка на софтуерразработка на софтуерacademy.devbg.orgacademy.devbg.org

Page 3: Обектно-ориентирано програмиране в  .NET

Необходими знанияНеобходими знания Добро познаване на принципите на Добро познаване на принципите на

обектно-ориентираното програмиранеобектно-ориентираното програмиране Добро познаване на поне единДобро познаване на поне един обектно-обектно-

ориентиран език за програмиранеориентиран език за програмиране C++C++ JavaJava C#C# Object Pascal / DelphiObject Pascal / Delphi

Базови познания за езика Базови познания за езика C#C# Базови познания за архитектурата на Базови познания за архитектурата на .NET .NET

FrameworkFramework

Page 4: Обектно-ориентирано програмиране в  .NET

СъдържаниеСъдържание ООП ООП –– ooсновни понятиясновни понятия ООП и .NET FrameworkООП и .NET Framework Класове и техните членовеКласове и техните членове – – полета, полета,

методи, конструкториметоди, конструктори Видимост на членоветеВидимост на членовете Статични методи и полетаСтатични методи и полета Статичен конструкторСтатичен конструктор СтруктуриСтруктури Предаване на параметрите, променлив Предаване на параметрите, променлив

брой параметриброй параметри Интерфейси и абстрактни класовеИнтерфейси и абстрактни класове

Page 5: Обектно-ориентирано програмиране в  .NET

СъдържаниеСъдържание Явна имплементация на интерфейсиЯвна имплементация на интерфейси НаследяванеНаследяване Клас диаграмиКлас диаграми ПолиморфизъмПолиморфизъм СвойстваСвойства (properties) (properties) ИндексаториИндексатори (indexers) (indexers) Предефиниране на операторитеПредефиниране на операторите в в C#C# Пространства от имена (Пространства от имена (namespaces)namespaces) Управление на изключениятаУправление на изключенията УпражненияУпражнения

Page 6: Обектно-ориентирано програмиране в  .NET

Обектно-ориентираният подходОбектно-ориентираният подход Обектно-ориентираното програмиране Обектно-ориентираното програмиране

(ООП) моделира обектите от реалния свят (ООП) моделира обектите от реалния свят със средствата на програмния езиксъс средствата на програмния език Обектите в ООП се характеризират сОбектите в ООП се характеризират с

атрибути (свойства)атрибути (свойства) операции (възможни действия)операции (възможни действия)

Основни принципи на ООПОсновни принципи на ООП Капсулация на даннитеКапсулация на данните НаследяванеНаследяване ПолиморфизъмПолиморфизъм Използване на изключенияИзползване на изключения

Обектно-ориентираното програмиране Обектно-ориентираното програмиране позволява преизползване на програмния позволява преизползване на програмния код (код (code reusecode reuse))

Page 7: Обектно-ориентирано програмиране в  .NET

Клас – категория обекти с общи свойства и Клас – категория обекти с общи свойства и операции, които могат да се извършват върху тях операции, които могат да се извършват върху тях (например всички сметки в дадена банка) (например всички сметки в дадена банка)

Обект – единичен обект от даден клас, инстанция Обект – единичен обект от даден клас, инстанция на клас (например банковата сметка на Светлин на клас (например банковата сметка на Светлин Наков)Наков)

Интерфейс – спецификация на съвкупност от Интерфейс – спецификация на съвкупност от действия, които даден обект предлагадействия, които даден обект предлага

Свойство – видима за външния свят Свойство – видима за външния свят характеристика (атрибут) на даден обектхарактеристика (атрибут) на даден обект

Метод – операция, която всички обекти от даден Метод – операция, която всички обекти от даден клас могат да извършватклас могат да извършват

Капсулация на данните – събиране на данните за Капсулация на данните – събиране на данните за даден обект и операциите над тях в едно цяло даден обект и операциите над тях в едно цяло (клас), като се ограничава директния достъп до (клас), като се ограничава директния достъп до тези данни и операциитези данни и операции

Основни понятия от ООПОсновни понятия от ООП

Page 8: Обектно-ориентирано програмиране в  .NET

Основни понятия от ООПОсновни понятия от ООП Абстракция на данните – възможността да Абстракция на данните – възможността да

работим с данни без да се интересуваме от работим с данни без да се интересуваме от тяхното вътрешно представяне, а само от тяхното вътрешно представяне, а само от операциите над тяхоперациите над тях

Абстракция на действията – възможността да Абстракция на действията – възможността да изпълняваме действия, за които не знаем изпълняваме действия, за които не знаем точно как са реализираниточно как са реализирани

Наследяване – възможността един клас Наследяване – възможността един клас (наследник) да придобие свойства и действия (наследник) да придобие свойства и действия от друг клас (родител)от друг клас (родител)

Полиморфизъм – възможността да Полиморфизъм – възможността да разглеждаме обекти от клас-наследник като разглеждаме обекти от клас-наследник като обекти от базов клас, като класът наследник обекти от базов клас, като класът наследник може да е предефинирал някои от действията може да е предефинирал някои от действията на базовия класна базовия клас

Page 9: Обектно-ориентирано програмиране в  .NET

ООП и ООП и .NET Framework.NET Framework В В .NET.NET Framework Framework обектно-ориентираният обектно-ориентираният

подход е залегнал на най-дълбоко подход е залегнал на най-дълбоко архитектурно нивоархитектурно ниво

Всички Всички .NET .NET приложения са обектно-приложения са обектно-ориентираниориентирани

Всички Всички .NET.NET езици са обектно- езици са обектно-ориентираниориентирани

Понятието клас от ООП има две Понятието клас от ООП има две реализации – класове и структуриреализации – класове и структури

Няма множествено наследяванеНяма множествено наследяване Класовете могат да имплементират Класовете могат да имплементират

няколко интерфейса едновременноняколко интерфейса едновременно

Page 10: Обектно-ориентирано програмиране в  .NET

КласовеКласове и членове на класи членове на клас В В .NET.NET класовете са класическа класовете са класическа

реализация на понятието клас от обектно-реализация на понятието клас от обектно-ориентираното програмиранеориентираното програмиране

Много приличат на класовете в Много приличат на класовете в C++ C++ ии Java Java Класовете имат членове Класовете имат членове (class members)(class members)

полета, константи, методи, свойства, полета, константи, методи, свойства, индексатори, събития, оператори, индексатори, събития, оператори, конструктори, деструкториконструктори, деструктори

вложени типове (вложени класове, структури, вложени типове (вложени класове, структури, интерфейси, делегати, ...)интерфейси, делегати, ...)

Членовете имат видимостЧленовете имат видимост public, private, protected, internalpublic, private, protected, internal

Членовете могат да бъдатЧленовете могат да бъдат статични (общи) или за дадена инстанциястатични (общи) или за дадена инстанция

Page 11: Обектно-ориентирано програмиране в  .NET

Пример за класПример за класclass Student class Student // декларация на клас Student// декларация на клас Student{{ private string mFirstName; private string mFirstName; // декларации на// декларации на private string mLastName; private string mLastName; // член-променливи// член-променливи private string mStudentId; private string mStudentId; // с видимост private// с видимост private

public Student() public Student() // конструктор на класа Student// конструктор на класа Student {{ // ...// ...

}}

public string FirstName public string FirstName // свойство FirstName с// свойство FirstName с { { // достъп само за четене// достъп само за четене getget {{ return mFirstName;return mFirstName; }} }}}}

Page 12: Обектно-ориентирано програмиране в  .NET

Член-променливи (полета)Член-променливи (полета) Член-променливите (полетата) съдържат данни Член-променливите (полетата) съдържат данни

за инстанцията на класаза инстанцията на класа Могат да бъдат от произволен типМогат да бъдат от произволен тип Могат да имат зададена видимостМогат да имат зададена видимост При деклариране може да им се задава стойностПри деклариране може да им се задава стойност

class Studentclass Student{{ private string mFirstName;private string mFirstName; private string mLastName;private string mLastName; private string mStudentId;private string mStudentId; private int mCourseprivate int mCourse = 1 = 1;; private string mSpeciality;private string mSpeciality; protected Course[] mCoursesTaken;protected Course[] mCoursesTaken; private string mRemarksprivate string mRemarks = "(няма забележки)" = "(няма забележки)";;}}

Page 13: Обектно-ориентирано програмиране в  .NET

Константни полетаКонстантни полета Константните полета са членове на класа, Константните полета са членове на класа,

като член-променливите, само чекато член-променливите, само че предшестват се от запазената дума предшестват се от запазената дума constconst при деклариране задължително им се задава при деклариране задължително им се задава

стойностстойност не могат да се променят по време на работане могат да се променят по време на работа

public public class MathConstantsclass MathConstants{{ public public const const string PI_SYMBOL = "π";string PI_SYMBOL = "π"; public const double PI = 3.141592653589793238public const double PI = 3.14159265358979323855;; public const double E = 2.7182818284590452354;public const double E = 2.7182818284590452354; public const double LN10 = 2.30258509299405;public const double LN10 = 2.30258509299405; public const double LN2 = 0.693147180559945;public const double LN2 = 0.693147180559945; public const double SQRT2 = 1.4142135623731;public const double SQRT2 = 1.4142135623731;}}

Page 14: Обектно-ориентирано програмиране в  .NET

Полета само за четенеПолета само за четене Полетата, които са само за четене Полетата, които са само за четене (read (read

only) only) са като константните полета, но:са като константните полета, но: стойността им се задава или при деклариране стойността им се задава или при деклариране

или в конструкторите на типа и повече не може или в конструкторите на типа и повече не може да се променяда се променя

предшестват се от запазената дума предшестват се от запазената дума readonlyreadonly представляват на практика представляват на практика runtime runtime константиконстанти

public class ReadOnlyDemo public class ReadOnlyDemo {{ private readonly int mSize;private readonly int mSize;

public ReadOnlyDemo(int aSize) public ReadOnlyDemo(int aSize) { { mSize = aSize;mSize = aSize; // can not be further modified!// can not be further modified! }}}}

Page 15: Обектно-ориентирано програмиране в  .NET

МетодиМетоди В В C# C# няма глобални функции, както в някои няма глобални функции, както в някои

други езици (като други езици (като C++ C++ ии Delphi) Delphi) Методи могат да се дефинират само като Методи могат да се дефинират само като

членове на тип (клас или структура)членове на тип (клас или структура) Методите дефинират операции за типа, в Методите дефинират операции за типа, в

който са дефинираникойто са дефинирани Могат да приемат параметри и да връщат Могат да приемат параметри и да връщат

стойностстойност Има няколко вида предаване на параметриИма няколко вида предаване на параметри Методите могат да имат зададена видимостМетодите могат да имат зададена видимост Могат да бъдат статични (да не са обвързани Могат да бъдат статични (да не са обвързани

с инстанция на типа)с инстанция на типа) Имат синтаксис, близък до Имат синтаксис, близък до C++ C++ и и JavaJava

Page 16: Обектно-ориентирано програмиране в  .NET

Методи – примерМетоди – примерpublic class MethodsDemopublic class MethodsDemo{{ // метод на инстанция – връща string// метод на инстанция – връща string private string ReadName()private string ReadName() {{ return Console.ReadLine();return Console.ReadLine(); }}

// статичен метод, приема int параметри и връща int// статичен метод, приема int параметри и връща int static int Multiply(int a, int b)static int Multiply(int a, int b) {{ returnreturn a*b; a*b; }}

public static void Main() public static void Main() // статичен метод// статичен метод {{ string name = (new MethodsDemo()).ReadName();string name = (new MethodsDemo()).ReadName(); int result = Multiply(5, 6);int result = Multiply(5, 6); Console.WriteLine(Console.WriteLine( "Hey, {0}, 5 * 6 = {1}", name, result);"Hey, {0}, 5 * 6 = {1}", name, result); }}}}

Page 17: Обектно-ориентирано програмиране в  .NET

Методи с еднакви именаМетоди с еднакви имена В един C# тип може да има няколко метода с едно В един C# тип може да има няколко метода с едно

и също име (overloaded methods)и също име (overloaded methods) Те се различават по между си по броя, типа и Те се различават по между си по броя, типа и

последователността на параметрите. Например:последователността на параметрите. Например:

Възможни са обърквания, например ако имаме Възможни са обърквания, например ако имаме методите методите Sqr(int)Sqr(int) и и Sqr(long)Sqr(long) и извикваме и извикваме Sqr(10)Sqr(10). Компилаторът не ни предупреждава за . Компилаторът не ни предупреждава за двусмислието.двусмислието.

static int Calculate(int a, int b) { return a + b;}

static long Calculate(long a, long b, long c) { return (a + b) * c;}

Page 18: Обектно-ориентирано програмиране в  .NET

КонструкториКонструктори Конструкторите се използват при създаване на Конструкторите се използват при създаване на

обект (инстанция)обект (инстанция) Служат за начално установяване на състоянието Служат за начално установяване на състоянието

(инициализация) на полетата на обекта(инициализация) на полетата на обекта Имат синтаксис като в Имат синтаксис като в C++C++ и и JavaJava Всеки клас може да има един или няколко Всеки клас може да има един или няколко

конструктора (съответно с различни параметри)конструктора (съответно с различни параметри) За класовете без дефиниран конструктор За класовете без дефиниран конструктор C# C#

компилаторът автоматично създава публичен компилаторът автоматично създава публичен конструктор по подразбиране, без параметриконструктор по подразбиране, без параметри

Всички неинициализирани в конструктора полета Всички неинициализирани в конструктора полета се нулират автоматично (това е гарантирано!) се нулират автоматично (това е гарантирано!)

Инициализациите на полета, дефинирани при Инициализациите на полета, дефинирани при декларацията им се поставят от компилатора в декларацията им се поставят от компилатора в началото на всеки конструкторначалото на всеки конструктор

Page 19: Обектно-ориентирано програмиране в  .NET

Конструктори – пример Конструктори – пример public class Studentpublic class Student{{ private string mName;private string mName; private int mStprivate int mStuudentId;dentId; private string private string mPositionmPosition = "Student"; = "Student";

public Student(string aName, int aStudentId)public Student(string aName, int aStudentId) {{ mName = aName;mName = aName; mStmStuudentId = aStudentId;dentId = aStudentId; }}

public Student(string aName) : this(aName, -1)public Student(string aName) : this(aName, -1) {{ }}

public static void Main() public static void Main() {{ Student s = new Student("Student s = new Student("Бай КироБай Киро", ", 1234512345);); }}}}

Page 20: Обектно-ориентирано програмиране в  .NET

Демонстрация Демонстрация #1#1 Използване на конструктори и Използване на конструктори и

изследване на компилирания за тях изследване на компилирания за тях MSIL MSIL кодкод

compilecompileDemo-1-Constructors.exeDemo-1-Constructors.exe

ILDASMILDASM

Page 21: Обектно-ориентирано програмиране в  .NET

Видимост (ниво на достъп)Видимост (ниво на достъп) Видимост (ниво на достъп) на членовете Видимост (ниво на достъп) на членовете

на типоветена типовете Задава се чрез специални запазени думи Задава се чрез специални запазени думи

((access modifiersaccess modifiers) при деклариране) при деклариране publicpublic – – неограничен достъпнеограничен достъп privateprivate – достъп само от текущия тип – достъп само от текущия тип protectedprotected – достъп само от текущия тип и неговите – достъп само от текущия тип и неговите

наследницинаследници internalinternal – достъп само от текущото асембли – достъп само от текущото асембли protected internalprotected internal – – достъп само от текущото достъп само от текущото

асембли и наследниците на типаасембли и наследниците на типа Ако не е зададен, по подразбиране достъпът Ако не е зададен, по подразбиране достъпът

до членовете е до членовете е privateprivate (за всички типове!) (за всички типове!) Видимостта на типовете в асемблито може Видимостта на типовете в асемблито може

да бъде да бъде publicpublic или или internalinternal

Page 22: Обектно-ориентирано програмиране в  .NET

Статични методи и полетаСтатични методи и полета Статичните методиСтатичните методи

Не са свързани с инстанция на никой класНе са свързани с инстанция на никой клас Предоставят статична функционалностПредоставят статична функционалност Могат да достъпват само статични членовеМогат да достъпват само статични членове Могат да се извикват без да е създадена Могат да се извикват без да е създадена

инстанция на типа, в който са дефинираниинстанция на типа, в който са дефинирани Приличат на глобалните функции в Приличат на глобалните функции в C++C++ и и

DelphiDelphi Статичните полета (член-променливи)Статичните полета (член-променливи)

Не са свързани с инстанцията на класа, в Не са свързани с инстанцията на класа, в който са дефинираникойто са дефинирани

Те са като глобални променливи – имат само Те са като глобални променливи – имат само една инстанция за цялото приложениеедна инстанция за цялото приложение

Могат да се достъпват без да е създадена Могат да се достъпват без да е създадена инстанция на типа, в който са дефинираниинстанция на типа, в който са дефинирани

Page 23: Обектно-ориентирано програмиране в  .NET

Статични методи и полета – примерСтатични методи и полета – пример

// // Класът Класът Singleton Singleton демонстрира добре познат шаблондемонстрира добре познат шаблон// за обектно-ориентирано проектиране – клас, който// за обектно-ориентирано проектиране – клас, който// трябва да има най-много една инстанция в рамките// трябва да има най-много една инстанция в рамките// на цялото приложение// на цялото приложение

public sealed class Singletonpublic sealed class Singleton{{ private private static Singleton static Singleton mInstancemInstance == null;null;

// конструкторът нарочно е // конструкторът нарочно е privateprivate

private private Singleton()Singleton() { { }}

public static Singleton GetInstance()public static Singleton GetInstance() {{ if (if (mImInstancenstance ==== null)null) mInstancemInstance = new Singleton(); = new Singleton(); return return mInstancemInstance;; }}}}

Page 24: Обектно-ориентирано програмиране в  .NET

Статичен конструкторСтатичен конструктор Статичният конструктор на даден клас се Статичният конструктор на даден клас се

изпълнява автоматично преди класът да изпълнява автоматично преди класът да започне реално да се използвазапочне реално да се използва извиква се най-много веднъж в рамките на извиква се най-много веднъж в рамките на

програматапрограмата гарантирано е извикан преди да се създаде гарантирано е извикан преди да се създаде

първата инстанция на класапървата инстанция на класа гарантирано е извикан преди първия достъп гарантирано е извикан преди първия достъп

до статичен член на класа (поле или метод)до статичен член на класа (поле или метод)

Използва се за инициализация на Използва се за инициализация на статичните член-променливи на класастатичните член-променливи на класа

Не приема параметри и модификатори на Не приема параметри и модификатори на достъпадостъпа

Page 25: Обектно-ориентирано програмиране в  .NET

Статичен конструктор – примерСтатичен конструктор – примерclass SqrtPrecalculatedclass SqrtPrecalculated{{ public const int MaxValue = 10000;public const int MaxValue = 10000; private static int[] mSqrtValues;private static int[] mSqrtValues;

// статичен конструктор – извиква се преди// статичен конструктор – извиква се преди // класът да започне да се използва// класът да започне да се използва static SqrtPrecalculated() static SqrtPrecalculated() {{ mSqrtValues = new int[MaxValue+1];mSqrtValues = new int[MaxValue+1]; for (int i=0; i<=MaxValue; i++)for (int i=0; i<=MaxValue; i++) mSqrtValues[i] = (int) Math.Sqrt(i);mSqrtValues[i] = (int) Math.Sqrt(i); }}

public static int GetSqrt(int aValue) public static int GetSqrt(int aValue) {{ return mSqrtValues[aValue];return mSqrtValues[aValue]; }}}}

Page 26: Обектно-ориентирано програмиране в  .NET

Демонстрация Демонстрация #2#2 Проследяване изпълнението на Проследяване изпълнението на

статичния конструкторстатичния конструктор

Page 27: Обектно-ориентирано програмиране в  .NET

СтруктуриСтруктури Структурите представляват съвкупност от полета Структурите представляват съвкупност от полета

с даннис данни Приличат много на класовете, но са типове по Приличат много на класовете, но са типове по

стойностстойност Най-често се разполагат в стекаНай-често се разполагат в стека Предават се по стойностПредават се по стойност Унищожават се при излизане от обхватУнищожават се при излизане от обхват

За разлика от структурите класовете са типове по За разлика от структурите класовете са типове по референция и се разполагат в динамичната паметреференция и се разполагат в динамичната памет Създаването и унищожаването им е по-бавноСъздаването и унищожаването им е по-бавно

При правилна употреба заместването на класове При правилна употреба заместването на класове със структури може значително да увеличи със структури може значително да увеличи производителносттапроизводителността

Не се препоръчва в структурите да има методи с Не се препоръчва в структурите да има методи с логика – трябва да съдържат само даннилогика – трябва да съдържат само данни

Page 28: Обектно-ориентирано програмиране в  .NET

Структури – пример Структури – пример struct Point struct Point {{ public int mX, mY;public int mX, mY;}}

struct Color struct Color {{ public byte mRedValue;public byte mRedValue; public byte mGreenValue;public byte mGreenValue; public byte mBlueValue;public byte mBlueValue;}}

struct Squarestruct Square{{ public Point mLocation;public Point mLocation; public int mSize;public int mSize; public Color mBorderColor;public Color mBorderColor; public Color mSurfaceColor;public Color mSurfaceColor;}}

Page 29: Обектно-ориентирано програмиране в  .NET

Разлика между клас и структураРазлика между клас и структура

class CValueclass CValue struct SValue struct SValue {{ {{ public int mValue;public int mValue; public int mValue;public int mValue;};}; };};

static void Change(CValue aCValue, SValue aSValue) static void Change(CValue aCValue, SValue aSValue) {{ aCValue.mValue = 2;aCValue.mValue = 2; aSValue.mValue = 2;aSValue.mValue = 2;}}

static void Main(string[] args)static void Main(string[] args){{ CValue cv = new CValue();CValue cv = new CValue(); SValue sv = new SValue();SValue sv = new SValue(); Change(cv, sv);Change(cv, sv); Console.WriteLine(cv.mValue); Console.WriteLine(cv.mValue); // Prints 2// Prints 2 Console.WriteLine(sv.mValue); Console.WriteLine(sv.mValue); // Prints 0// Prints 0}}

Page 30: Обектно-ориентирано програмиране в  .NET

Предаване на параметритеПредаване на параметрите Параметрите на методите могат да се Параметрите на методите могат да се

предават по няколко начинапредават по няколко начина inin ( (по подразбиранепо подразбиране))

предаване по стойност за предаване по стойност за value typesvalue types предаване по референция за предаване по референция за reference typesreference types

outout предаване по адрес за предаване по адрес за value types value types и по адрес на и по адрес на

референцията за референцията за reference typesreference types инициализацията се извършва от извиквания инициализацията се извършва от извиквания

метод, а преди нея достъпът е само за писанеметод, а преди нея достъпът е само за писане refref

предаване по адрес за предаване по адрес за value types value types и по адрес на и по адрес на референцията за референцията за reference typesreference types

инициализацията се извършва от извикващия инициализацията се извършва от извикващия метод – достъпът е за четене и писанеметод – достъпът е за четене и писане

Page 31: Обектно-ориентирано програмиране в  .NET

public struct Point {public struct Point { internal int mX, mY;internal int mX, mY; }}

public static void IncorrectMultiplyBy2(Point aPoint)public static void IncorrectMultiplyBy2(Point aPoint){{ aPoint.mX *= 2;aPoint.mX *= 2; aPoint.mY *= 2;aPoint.mY *= 2;}}

public static void MultiplyBy2(ref Point aPoint)public static void MultiplyBy2(ref Point aPoint){{ aPoint.mX *= 2;aPoint.mX *= 2; aPoint.mY *= 2;aPoint.mY *= 2;}}

static void Main(string[] args)static void Main(string[] args){{ Point p = new Point();Point p = new Point(); p.mX = 5;p.mX = 5; p.mY = -8;p.mY = -8; Console.WriteLine("p=({0},{1})", p.mX, p.mY);Console.WriteLine("p=({0},{1})", p.mX, p.mY); // 5,-8// 5,-8 IncorrectMultiplyBy2(p);IncorrectMultiplyBy2(p); Console.WriteLine("p=({0},{1})", p.mX, p.mY);Console.WriteLine("p=({0},{1})", p.mX, p.mY); // 5,-8// 5,-8 MultiplyBy2(ref p);MultiplyBy2(ref p); Console.WriteLine("p=({0},{1})", p.mX, p.mY);Console.WriteLine("p=({0},{1})", p.mX, p.mY); // 10,-16// 10,-16}}

refref параметри – примерпараметри – пример

Page 32: Обектно-ориентирано програмиране в  .NET

public class Studentpublic class Student{{ public string mName;public string mName; public Student(string aName) { mName = aName; }public Student(string aName) { mName = aName; }}}

static void IncorrectModifyStudent(Student aStudent)static void IncorrectModifyStudent(Student aStudent){{ aStudent = new Student("Changed: " + aStudent.mName);aStudent = new Student("Changed: " + aStudent.mName);}}

static void ModifyStudent(ref Student aStudent) static void ModifyStudent(ref Student aStudent) {{ aStudent = new Student("Changed: " + aStudent.mName);aStudent = new Student("Changed: " + aStudent.mName);}}

static void Main(string[] args)static void Main(string[] args){{ Student s = new Student("Student s = new Student("НаковНаков");"); Console.WriteLine(s.mName); Console.WriteLine(s.mName); // // НаковНаков IncorrectModifyStudent(s);IncorrectModifyStudent(s); Console.WriteLine(s.mName); Console.WriteLine(s.mName); // // НаковНаков ModifyStudent(ref s);ModifyStudent(ref s); Console.WriteLine(s.mName); Console.WriteLine(s.mName); // Changed: // Changed: НаковНаков}}

refref параметри – примерпараметри – пример

Page 33: Обектно-ориентирано програмиране в  .NET

public struct Pointpublic struct Point{{ public int mX, mY;public int mX, mY;

public Point(int aX, int aY)public Point(int aX, int aY) {{ mX = aX;mX = aX; mY = aY;mY = aY; }}}}

public struct Dimensionspublic struct Dimensions{{ public int mWidth, mHeight;public int mWidth, mHeight;

public Dimensions(int aWidth, int aHeight)public Dimensions(int aWidth, int aHeight) {{ mWidth = aWidth;mWidth = aWidth; mHeight = aHeight;mHeight = aHeight; }}}} ((примерът продължава)примерът продължава)

outout параметри – примерпараметри – пример

Page 34: Обектно-ориентирано програмиране в  .NET

public class Rectangle { private int mX, mY, mWidth, mHeight;

public Rectangle(int aX,int aY, int aWidth,int aHeight) { mX = aX; mY = aY; mWidth = aWidth; mHeight = aHeight; }

public void GetLocationAndDimensions( out Point aLocation, out Dimensions aDimensions) { aLocation = new Point(mX, mY); aDimensions = new Dimensions(mWidth, mHeight); }} (примерът продължава)

out параметри – пример

Page 35: Обектно-ориентирано програмиране в  .NET

class TestOutParameters{ static void Main(string[] args) { Rectangle rect = new Rectangle(5, 10, 12, 8);

Point location; Dimensions dimensions;

// location и dimension не се инициализират предварително rect.GetLocationAndDimensions( out location, out dimensions);

Console.WriteLine("({0}, {1}, {2}, {3})", location.mX, location.mY, dimensions.mWidth, dimensions.mHeight); // Резултат: (5, 10, 12, 8) }}

out параметри – пример

Page 36: Обектно-ориентирано програмиране в  .NET

Променлив брой параметриПроменлив брой параметри В C# можем да дефинираме методи с В C# можем да дефинираме методи с

променлив брой параметрипроменлив брой параметри Пример за Пример за такъв такъв методметод е е

Console.WriteLine(string, params object[])Console.WriteLine(string, params object[])

За означаване на параметрите, които са с За означаване на параметрите, които са с променлив брой, се ипроменлив брой, се използва зползва масив и масив и служебната дума служебната дума paramsparams, която, която Може да се използва най-много веднъж в Може да се използва най-много веднъж в

декларацията на методадекларацията на метода Може да се прилага само за последния Може да се прилага само за последния

параметър в декларацията на методапараметър в декларацията на метода

Компилаторът предава Компилаторът предава параметрите параметрите като като масивмасив от зададен тип от зададен тип

Page 37: Обектно-ориентирано програмиране в  .NET

Променлив брой параметри – примерПроменлив брой параметри – пример

class TestParamsclass TestParams{{ /// <summary>/// <summary> /// Calculates the average of the given values./// Calculates the average of the given values. //// </summary>// </summary> public static double Average(params int[] aValues)public static double Average(params int[] aValues) {{ double avg = 0;double avg = 0; for (int i=0; i<aValues.Length; i++) for (int i=0; i<aValues.Length; i++) avg += aValues[i];avg += aValues[i]; avg = avg / aValues.Length;avg = avg / aValues.Length; return avg;return avg; }}

static void Main(string[] args)static void Main(string[] args) {{ Console.WriteLine(Average(Console.WriteLine(Average(55,6,,6,66));)); Console.WriteLine(Average(6,6,5,4,6,5,6));Console.WriteLine(Average(6,6,5,4,6,5,6)); }}}}

Page 38: Обектно-ориентирано програмиране в  .NET

ИнтерфейсиИнтерфейси Интерфейсите описват съвкупност от методи Интерфейсите описват съвкупност от методи

(операции) и свойства, които могат да бъдат (операции) и свойства, които могат да бъдат реализирани от някой клас или структурареализирани от някой клас или структура

Те дефинират само прототипите на методите, Те дефинират само прототипите на методите, но не и конкретната им реализацияно не и конкретната им реализация

Могат да се използват за дефиниране на Могат да се използват за дефиниране на абстрактни типове данниабстрактни типове данни

Интерфейсите в Интерфейсите в C# C# са подобни на са подобни на абстрактните класове, но за разлика от тяхабстрактните класове, но за разлика от тях не съдържат имплементация на методите сине съдържат имплементация на методите си членовете им нямат модификатори на видимостта членовете им нямат модификатори на видимостта

и се подразбира видимост и се подразбира видимост publicpublic не могат да имат полета, дори да са константи (не е не могат да имат полета, дори да са константи (не е

като в като в Java)Java), но могат да имат свойства и събития, но могат да имат свойства и събития

Page 39: Обектно-ориентирано програмиране в  .NET

Интерфейси – примери Интерфейси – примери interface IShapeinterface IShape{{ void SetPosition(int aX, int aY);void SetPosition(int aX, int aY); int int CalculateCalculateSurface();Surface();}}

interface IMovableinterface IMovable{{ void Move(int aDeltaX, int aDeltaY);void Move(int aDeltaX, int aDeltaY);}}

interface IResizableinterface IResizable{{ void Resize(int aWeight);void Resize(int aWeight); void Resize(int aWeightX, int aWeightY);void Resize(int aWeightX, int aWeightY); void ResizeByX(int aWeightX);void ResizeByX(int aWeightX); void ResizeByY(int aWeightY);void ResizeByY(int aWeightY);}}

Page 40: Обектно-ориентирано програмиране в  .NET

Интерфейси – примери Интерфейси – примери public interface IPersonpublic interface IPerson{{ string Namestring Name // property Name// property Name {{ get;get; set;set; }}

DateTime DateOfBirth DateTime DateOfBirth // property DateOfBirth// property DateOfBirth {{ get;get; set;set; }}

int Ageint Age // property Age// property Age ( (readread--onlyonly)) {{ get;get; }}}}

Page 41: Обектно-ориентирано програмиране в  .NET

Реализация на интерфейси. Реализация на интерфейси. Абстрактни класовеАбстрактни класове Класовете и структурите могат да реализират Класовете и структурите могат да реализират

(имплементират, поддържат) един или (имплементират, поддържат) един или няколко интерфейсаняколко интерфейса

Реализацията на интерфейс изисква да се Реализацията на интерфейс изисква да се дефинира имплементация на методите мудефинира имплементация на методите му

Когато не всички методи от поддържаните Когато не всички методи от поддържаните интерфейси са имплементирани, класът или интерфейси са имплементирани, класът или структурата могат да се декларират като структурата могат да се декларират като абстрактниабстрактни

Абстрактните класове реализират само някои Абстрактните класове реализират само някои от методите си и задължават наследниците от методите си и задължават наследниците си да реализират останалитеси да реализират останалите

Абстрактните класове не могат да се Абстрактните класове не могат да се инстанцират директноинстанцират директно

Page 42: Обектно-ориентирано програмиране в  .NET

Реализация на интерфейси – пример Реализация на интерфейси – пример

class Rectangle : IShape, IMovableclass Rectangle : IShape, IMovable{{ private int mX, mY, mWidth, mHeight;private int mX, mY, mWidth, mHeight;

public void SetPosition(int aX, int aY) public void SetPosition(int aX, int aY) // IShape// IShape {{ mX = aX;mX = aX; mY = aY;mY = aY; }}

public int CalculateSurface() public int CalculateSurface() // IShape// IShape {{ return mWidth * mHeight;return mWidth * mHeight; }}

public void Move(int aDeltaX, int aDeltaY) public void Move(int aDeltaX, int aDeltaY) // IMovable// IMovable {{ mX += aDeltaX;mX += aDeltaX; mY += aDeltaY;mY += aDeltaY; }}}}

Page 43: Обектно-ориентирано програмиране в  .NET

Абстрактен клас – пример Абстрактен клас – пример abstract class MovableShape : IShape, IMovableabstract class MovableShape : IShape, IMovable{{ private int mX, mY;private int mX, mY;

public void Move(int aDeltaX, int aDeltaY) public void Move(int aDeltaX, int aDeltaY) {{ mX += aDeltaX;mX += aDeltaX; mY += aDeltaY;mY += aDeltaY; }}

public void SetPosition(int aX, int aY) public void SetPosition(int aX, int aY) {{ mX = aX;mX = aX; mY = aY;mY = aY; }}

public abstract int public abstract int CalculateCalculateSurface();Surface();}}

Page 44: Обектно-ориентирано програмиране в  .NET

Явна имплементация на интерфейсЯвна имплементация на интерфейс

Интерфейсите в Интерфейсите в .NET.NET могат да бъдат могат да бъдат имплементирани явно (имплементирани явно (explicit interface explicit interface implementationimplementation))

Това позволява да се имплементират Това позволява да се имплементират едновременно няколко интерфейса, които едновременно няколко интерфейса, които съдържат методи с еднаква сигнатурасъдържат методи с еднаква сигнатура

Когато даден член на даден интерфейс се Когато даден член на даден интерфейс се имплементира явноимплементира явно, , той става недостъпен той става недостъпен през инстанциите на класа, но остава през инстанциите на класа, но остава достъпен през интерфейсадостъпен през интерфейса

В В .NET.NET се позволява в един клас да има се позволява в един клас да има два метода с еднаква сигнатура, стига два метода с еднаква сигнатура, стига единият от тях да е явна имплементация единият от тях да е явна имплементация на интерфейсна интерфейс

Page 45: Обектно-ориентирано програмиране в  .NET

Явна имплементация – примерЯвна имплементация – примерpublic interface I1public interface I1{{ void Test();void Test();}}

public interface I2public interface I2{{ void Test();void Test();}}

public class TestExplicit : I1, I2public class TestExplicit : I1, I2{{ void I1.Test()void I1.Test() {{ Console.WriteLine("I1.Test() called");Console.WriteLine("I1.Test() called"); }}

void I2.Test()void I2.Test() {{ Console.WriteLine("I2.Test called");Console.WriteLine("I2.Test called"); }}

((примерът продължава)примерът продължава)

Page 46: Обектно-ориентирано програмиране в  .NET

Явна имплементация – примерЯвна имплементация – пример public void Test()public void Test() {{ Console.WriteLine("TestExplicit.Test() called");Console.WriteLine("TestExplicit.Test() called"); }}

public static void Main()public static void Main() {{ TestExplicit t = new TestExplicit();TestExplicit t = new TestExplicit();

// Prints: TestExplicit.Test() called// Prints: TestExplicit.Test() called t.Test(); t.Test();

// Prints: I1.Test() called// Prints: I1.Test() called I1 i1 = (I1) t; I1 i1 = (I1) t; i1.Test(); i1.Test();

// Prints: I2.Test() called// Prints: I2.Test() called I2 i2 = (I2) t;I2 i2 = (I2) t; i2.Test(); i2.Test(); }}}}

Page 47: Обектно-ориентирано програмиране в  .NET

НаследяванеНаследяване Наследяването е основна концепция в Наследяването е основна концепция в

обектно-ориентираното програмиранеобектно-ориентираното програмиране В В C#C# класовете и структурите могат да се класовете и структурите могат да се

наследяватнаследяват Наследяват се всички членове – полета, Наследяват се всички членове – полета,

методи, свойства, методи, свойства, ...... Класът-родител се нарича базов класКласът-родител се нарича базов клас Класът-наследник се нарича разширен Класът-наследник се нарича разширен

клас (клас (derived classderived class)) Наследяването позволява изграждане на Наследяването позволява изграждане на

йерархии от типовейерархии от типове ВВ ..NET NET няма множествено наследяваненяма множествено наследяване

освен на интерфейсиосвен на интерфейси

Page 48: Обектно-ориентирано програмиране в  .NET

Наследяване – примерНаследяване – примерstruct Pointstruct Point{{ public int mX, mY;public int mX, mY;

public Point(int aX, int aY)public Point(int aX, int aY) {{ mX = aX;mX = aX; mY = aY;mY = aY; }}}}

struct Color struct Color {{ public byte mRedValue;public byte mRedValue; public byte mGreenValue;public byte mGreenValue; public byte mBlueValue;public byte mBlueValue;

public Color(byte aRed, byte aGreen, byte aBlue)public Color(byte aRed, byte aGreen, byte aBlue) {{ mRedValue = aRed;mRedValue = aRed; mGreenValue = aGreen;mGreenValue = aGreen; mBlueValue = aBlue;mBlueValue = aBlue; }}}} (примерът продължава)(примерът продължава)

Page 49: Обектно-ориентирано програмиране в  .NET

Наследяване – примерНаследяване – пример/// <summary>/// <summary>/// Базов клас за всички геометрични/// Базов клас за всички геометрични/// фигури в нашето приложение/// фигури в нашето приложение/// </summary>/// </summary>abstract class Shapeabstract class Shape{{ protected Point mPosition;protected Point mPosition;}}

/// <summary>/// <summary>/// Интерфейс за всички фигури, които/// Интерфейс за всички фигури, които/// могат да изчисляват лицето/// могат да изчисляват лицето си си/// </summary>/// </summary>interface ISurfaceCalculatableinterface ISurfaceCalculatable{{ int int CalculateCalculateSurface();Surface();}}

(примерът продължава)(примерът продължава)

Page 50: Обектно-ориентирано програмиране в  .NET

Наследяване – примерНаследяване – пример/// <summary>/// <summary>/// Клас Square, наследник на класа Shape,/// Клас Square, наследник на класа Shape,/// поддържа интерфейса ISurfaceCalculatable/// поддържа интерфейса ISurfaceCalculatable/// </summary>/// </summary>class Square : Shape, ISurfaceCalculatableclass Square : Shape, ISurfaceCalculatable{{ private int mSize;private int mSize;

public Square(int aX, int aY, int aSize) public Square(int aX, int aY, int aSize) {{ mPosition.mX = aX;mPosition.mX = aX; mPosition.mY = aY;mPosition.mY = aY; mSize = aSize;mSize = aSize; }}

public int public int CalculateCalculateSurface() Surface() {{ return mSize * mSize;return mSize * mSize; }}}} (примерът продължава)(примерът продължава)

Page 51: Обектно-ориентирано програмиране в  .NET

Наследяване – примерНаследяване – пример/// <summary>/// <summary>/// Клас Rectangle, наследник на класа Shape,/// Клас Rectangle, наследник на класа Shape,/// поддържа интерфейса ISurfaceCalculatable/// поддържа интерфейса ISurfaceCalculatable/// </summary>/// </summary>class Rectangle : Shape, ISurfaceCalculatableclass Rectangle : Shape, ISurfaceCalculatable{{ private int mWidth, mHeight;private int mWidth, mHeight;

public Rectangle(int aX, int aY, int aWidth,public Rectangle(int aX, int aY, int aWidth, int aHeight)int aHeight) {{ mPosition.mX = aX;mPosition.mX = aX; mPosition.mY = aY;mPosition.mY = aY; mWidth = aWidth;mWidth = aWidth; mHeight = aHeight;mHeight = aHeight; }}

public int GetSurface()public int GetSurface() {{ return mWidth * mHeight;return mWidth * mHeight; }}}} (примерът продължава)(примерът продължава)

Page 52: Обектно-ориентирано програмиране в  .NET

Наследяване – примерНаследяване – примерclass FilledRectangleclass FilledRectangle : Rectangle : Rectangle {{ private Color mColor;private Color mColor;

public FilledRectangle(int aX, int aY, int aWidth, public FilledRectangle(int aX, int aY, int aWidth, int aHeight) : base(aX, aY, aWidth, aHeight)int aHeight) : base(aX, aY, aWidth, aHeight) {{ mColor = new Color(0,0,0);mColor = new Color(0,0,0); }}}}

class FilledSquareclass FilledSquare : Square: Square{{ private Color mColor;private Color mColor;

public FilledSquare(int aX, int aY, int aSize) public FilledSquare(int aX, int aY, int aSize) : base(aX, aY, aSize): base(aX, aY, aSize) {{ mColor = new Color(0,0,0);mColor = new Color(0,0,0); }}}}

Page 53: Обектно-ориентирано програмиране в  .NET

Клас диаграмиКлас диаграми Клас диаграмите представляват Клас диаграмите представляват

стандартна стандартна UML UML нотация за изобразяване нотация за изобразяване на класови йерархиина класови йерархии

Създават визуална представа за Създават визуална представа за взаимовръзките между класоветевзаимовръзките между класовете

Класовете се изобразяват с Класовете се изобразяват с правоъгълници, в които са записани правоъгълници, в които са записани членовете имчленовете им

Връзките между класовете се изобразяват Връзките между класовете се изобразяват със стрелкисъс стрелки

Клас диаграмите онагледяват класовите Клас диаграмите онагледяват класовите йерархии, получени при многократно йерархии, получени при многократно наследяваненаследяване

Page 54: Обектно-ориентирано програмиране в  .NET

Клас диаграми – примерКлас диаграми – примерShape

#m Position:Point

structPoint

+m X:int+m Y:int

+Point

interfaceISurfaceCalculatable

+CalculateSurface:in t

Rectangle

-m W idth:int-m Height:in t

+Rectangle+CalculateSurface:in t

Square

-m S ize:in t

+Square+CalculateSurface:in t

FilledSquare

-m Color:Color

+FilledSquare

structColor

+m RedValue:byte+m G reenValue:byte+m BlueValue:byte

+Color

FilledRectangle

-m Color:Color

+FilledRectangle

Page 55: Обектно-ориентирано програмиране в  .NET

ПолиморфизъмПолиморфизъм Полиморфизмът е основна концепция в обектно-Полиморфизмът е основна концепция в обектно-

ориентираното програмиранеориентираното програмиране Той дава възможност да разглеждаме обекти от Той дава възможност да разглеждаме обекти от

клас-наследник като обекти от базов клас, като клас-наследник като обекти от базов клас, като класът наследник може да променя класът наследник може да променя имплементацията на някои от наследените от имплементацията на някои от наследените от действиядействия

Полиморфизмът позволява промяна на Полиморфизмът позволява промяна на имплементацията на т. нар. виртуални методиимплементацията на т. нар. виртуални методи ((дефинират се като дефинират се като virtualvirtual)) и в частност на и в частност на абстрактните методи и методите на интерфейсите абстрактните методи и методите на интерфейсите (които са чисто виртуални)(които са чисто виртуални)

В В C# C# при припокриване на виртуален метод се при припокриване на виртуален метод се използва ключовата дума използва ключовата дума overrideoverride

C#C# позволява скриване на виртуални методи в позволява скриване на виртуални методи в класа наследник чрез ключовата дума класа наследник чрез ключовата дума newnew

Page 56: Обектно-ориентирано програмиране в  .NET

Полиморфизъм – пример Полиморфизъм – пример class Personclass Person{{ public virtual void PrintName() public virtual void PrintName() {{ Console.WriteLine("I am an instance of {0}.", Console.WriteLine("I am an instance of {0}.", this.GetType().Name);this.GetType().Name); }}}}

class Instructor : Personclass Instructor : Person{{ public override void PrintName() public override void PrintName() {{ Console.WriteLine("I am an instructor.");Console.WriteLine("I am an instructor."); }}}}

class Student : Personclass Student : Person{{ public override void PrintName() public override void PrintName() {{ base.PrintName();base.PrintName(); Console.WriteLine("I am a student.");Console.WriteLine("I am a student."); }}}} (примерът продължава)(примерът продължава)

Page 57: Обектно-ориентирано програмиране в  .NET

Полиморфизъм – примерПолиморфизъм – примерstatic void PrintPersonName(Person aPerson) static void PrintPersonName(Person aPerson) {{ aPerson.PrintName();aPerson.PrintName();}}

static void Main(string[] args)static void Main(string[] args){{ Person person = new Person();Person person = new Person(); Console.Write("Person: ");Console.Write("Person: "); PrintPersonName(person);PrintPersonName(person); // Person: I am an instance of Person.// Person: I am an instance of Person.

Person instructor = new Instructor();Person instructor = new Instructor(); Console.Write("\nInstructor: ");Console.Write("\nInstructor: "); PrintPersonName(instructor);PrintPersonName(instructor); // Instructor: I am an instructor.// Instructor: I am an instructor.

Person student = new Student();Person student = new Student(); Console.Write("\nStudent: ");Console.Write("\nStudent: "); PrintPersonName(student);PrintPersonName(student); // Student: I am an instance of Student.// Student: I am an instance of Student. // I am a student.// I am a student.}}

Page 58: Обектно-ориентирано програмиране в  .NET

Демонстрация Демонстрация ##33 Проследяване изпълнението на Проследяване изпълнението на

полиморфни класовеполиморфни класове

Page 59: Обектно-ориентирано програмиране в  .NET

Принципи при ОО дизайнаПринципи при ОО дизайна Функционална независимост (Функционална независимост (loose loose

couplingcoupling)) Класовете и методите трябва са Класовете и методите трябва са

минимално обвързани един с другминимално обвързани един с друг Трябва да е лесно да се извади даден клас Трябва да е лесно да се извади даден клас

или метод и да се използва в друг проектили метод и да се използва в друг проект Силна свързаност на отговорностите Силна свързаност на отговорностите

((strong cohesionstrong cohesion)) ДействиятаДействията,, които даден метод които даден метод илиили клас клас

извършва, трябва да са логически извършва, трябва да са логически свързани, да решават общ проблемсвързани, да решават общ проблем

Един метод или клас трябва да решава Един метод или клас трябва да решава само една задача и да я решава добресамо една задача и да я решава добре

Page 60: Обектно-ориентирано програмиране в  .NET

Свойства Свойства (properties)(properties) Свойствата са членове на класовете, Свойствата са членове на класовете,

структурите и интерфейсите, които структурите и интерфейсите, които контролират достъпа до полетата на типаконтролират достъпа до полетата на типа

Свойствата са като член-променливите – Свойствата са като член-променливите – имат име, по което са достъпни и стойност имат име, по което са достъпни и стойност от някакъв предварително определен типот някакъв предварително определен тип

Свойствата могат да имат два компонента:Свойствата могат да имат два компонента: програмен код за прочитане на стойносттапрограмен код за прочитане на стойността програмен код за присвояване на стойносттапрограмен код за присвояване на стойността

Могат да бъдат:Могат да бъдат: само за четенесамо за четене за четене и за писанеза четене и за писане само за писанесамо за писане

Page 61: Обектно-ориентирано програмиране в  .NET

Свойства – примерСвойства – примерpublic class Person public class Person {{ private string mName;private string mName; private DateTime mDateOfBirth;private DateTime mDateOfBirth;

public string Namepublic string Name // // свойство свойство Name Name от тип от тип stringstring {{ get get {{ return mName;return mName; }}

set set {{ if ((value != null) && (value.Length > 0))if ((value != null) && (value.Length > 0)) {{ mName = value;mName = value; }} else else {{ throw new throw new ArgumentArgumentException(Exception( "Invalid name!");"Invalid name!"); }} }} }} (примерът продължава)(примерът продължава)

Page 62: Обектно-ориентирано програмиране в  .NET

Свойства – пример Свойства – пример // Дефиниция на свойство DateOfBirth от тип DateTime// Дефиниция на свойство DateOfBirth от тип DateTime public DateTime DateOfBirthpublic DateTime DateOfBirth {{ getget {{ return mDateOfBirth;return mDateOfBirth; }}

setset {{ if ((value.Year >= 1900) && if ((value.Year >= 1900) && (value.Year <= DateTime.Now.Year))(value.Year <= DateTime.Now.Year)) {{ mDateOfBirth = value;mDateOfBirth = value; }} else else {{ throw new ArgumentOutOfRangeException(throw new ArgumentOutOfRangeException( "Invalid date of birth!");"Invalid date of birth!"); }} }} }} (примерът продължава)(примерът продължава)

Page 63: Обектно-ориентирано програмиране в  .NET

Свойства – примерСвойства – пример // // Дефиниция на сДефиниция на свойство Age от тип intвойство Age от тип int, , само за четенесамо за четене public int Agepublic int Age {{ getget {{ DateTime now = DateTime.Now;DateTime now = DateTime.Now; int yearsOld = now.Year - mDateOfBirth.Year;int yearsOld = now.Year - mDateOfBirth.Year;

DateTime birthdayThisYear = DateTime birthdayThisYear = new DateTime(now.Year, mDateOfBirth.Month, new DateTime(now.Year, mDateOfBirth.Month, mDateOfBirth.Day, mDateOfBirth.Hour,mDateOfBirth.Day, mDateOfBirth.Hour, mDateOfBirth.Minute, mDateOfBirth.Second);mDateOfBirth.Minute, mDateOfBirth.Second); if (DateTime.Compare(now, birthdayThisYear) < if (DateTime.Compare(now, birthdayThisYear) < 0)0) {{ yearsOld--;yearsOld--; }}

return yearsOld;return yearsOld; }} }}}} (примерът продължава)(примерът продължава)

Page 64: Обектно-ориентирано програмиране в  .NET

Свойства – примерСвойства – пример// // Пример за използване на свойствата на класа Пример за използване на свойствата на класа PersonPersonclass PropertiesDemoclass PropertiesDemo{{ static void Main(string[] args)static void Main(string[] args) {{ Person person = new Person();Person person = new Person(); person.Name = "Svetlin Nakov";person.Name = "Svetlin Nakov"; person.DateOfBirth = person.DateOfBirth = new DateTime(1980, 6, 14);new DateTime(1980, 6, 14);

Console.WriteLine(Console.WriteLine( "{0} is born on {1:dd.MM.yyyy}.", "{0} is born on {1:dd.MM.yyyy}.",

person.Name, person.DateOfBirth);person.Name, person.DateOfBirth);

Console.WriteLine("{0} is {1} years old.", Console.WriteLine("{0} is {1} years old.", person.Name, person.Age);person.Name, person.Age); }}}}

Page 65: Обектно-ориентирано програмиране в  .NET

Демонстрация Демонстрация #4#4 Проследяване изпълнението на Проследяване изпълнението на

свойствата на класоветесвойствата на класовете

Page 66: Обектно-ориентирано програмиране в  .NET

ИндексаториИндексатори Индексаторите (Индексаторите (indexersindexers) са членове ) са членове

на класовете, структурите и на класовете, структурите и интерфейсите, които:интерфейсите, които: предоставят индексиран достъп до предоставят индексиран достъп до

някакви данни, подобен на достъпа до някакви данни, подобен на достъпа до елементите на масивитеелементите на масивите

приличат на свойствата са, но приличат на свойствата са, но получават като параметър получават като параметър идентификатор или индекс на елемент, идентификатор или индекс на елемент, с който да работятс който да работят

на практика чрез тях се извършва на практика чрез тях се извършва предефиниране на оператора предефиниране на оператора [][] за за произволен типпроизволен тип

Page 67: Обектно-ориентирано програмиране в  .NET

ИндексаториИндексатори Идентификаторът на елемента се Идентификаторът на елемента се

указва с квадратни скоби,указва с квадратни скоби, например:например:

Индексаторите могат да бъдат с по Индексаторите могат да бъдат с по няколко параметъра от различен тип, няколко параметъра от различен тип, например:например:

Индексаторите са много удобни за Индексаторите са много удобни за пряк достъп до списъчни структурипряк достъп до списъчни структури

myArrayList[5]myArrayList[5]

personInfo["Бай Иван", 68]personInfo["Бай Иван", 68]

Page 68: Обектно-ориентирано програмиране в  .NET

Индексатори – примерИндексатори – примерstruct BitArray32struct BitArray32{{ private uint mValue;private uint mValue;

// Декларация на индексатор// Декларация на индексатор public int thispublic int this [int index][int index] {{ get get {{ if (index >= 0 && index <= 31) if (index >= 0 && index <= 31) {{ // Check the bit at position index// Check the bit at position index if ((mValue & (1 << index)) == 0)if ((mValue & (1 << index)) == 0) return 0;return 0; elseelse return 1;return 1; }} else else {{ throw new throw new ApplicationApplicationException(String.Exception(String. Format("Index {0} is invalid!", index));Format("Index {0} is invalid!", index)); }} }} (примерът продължава)(примерът продължава)

Page 69: Обектно-ориентирано програмиране в  .NET

Индексатори – примерИндексатори – пример set set {{ if (index < 0 || index > 31)if (index < 0 || index > 31) throw new ApplicationException(String.throw new ApplicationException(String. Format("Index {0} is invalid!", index));Format("Index {0} is invalid!", index));

if (value < 0 || value > 1)if (value < 0 || value > 1) throw new ApplicationException(String.throw new ApplicationException(String. Format("Value {0} is invalid!", value));Format("Value {0} is invalid!", value));

// Clear the bit at position index// Clear the bit at position index mValue &= ~((uint)(1 << index));mValue &= ~((uint)(1 << index));

// Set the bit at position index to value// Set the bit at position index to value mValue |= (uint)(value << index);mValue |= (uint)(value << index); }} }}}}

(примерът продължава)(примерът продължава)

Page 70: Обектно-ориентирано програмиране в  .NET

Индексатори – примерИндексатори – примерclass IndexerTestclass IndexerTest{{ static void Main(string[] args)static void Main(string[] args) {{ BitArray32 arr = new BitArray32();BitArray32 arr = new BitArray32();

arr[0] = 1;arr[0] = 1; arr[5] = 1;arr[5] = 1; arr[5] = 0;arr[5] = 0; arr[25] = 1;arr[25] = 1; arr[31] = 1;arr[31] = 1;

for (int i=0; i<=31; i++) for (int i=0; i<=31; i++) Console.WriteLine(Console.WriteLine( "arr[{0}] = {1}", i, arr[i]);"arr[{0}] = {1}", i, arr[i]); }}}}

Page 71: Обектно-ориентирано програмиране в  .NET

Демонстрация Демонстрация ##55 Проследяване работата на Проследяване работата на

индексаториндексатор

Page 72: Обектно-ориентирано програмиране в  .NET

Индексатори – още един примерИндексатори – още един примерclass Distanceclass DistanceCalculatorCalculator{{ public int this[string aTown1, string aTown2]public int this[string aTown1, string aTown2] {{ get get {{ if (aTown1.Equals("София") && aTown2.Equals("Варна"))if (aTown1.Equals("София") && aTown2.Equals("Варна")) return 470;return 470; elseelse throw new throw new ApplicationApplicationException("Unknown distance!");Exception("Unknown distance!"); }} }}}}

class DistanceTestclass DistanceTest{{ static void Main(string[] args)static void Main(string[] args) {{ DistanceDistanceCalculatorCalculator d dcc = new Distance = new DistanceCalculatorCalculator();(); Console.WriteLine("Разстоянието между {0} и {1} е {2} Console.WriteLine("Разстоянието между {0} и {1} е {2} " +" + ""километра.",километра.", "София", "Варна", d"София", "Варна", dcc["София", "Варна"]);["София", "Варна"]); }}}}

Page 73: Обектно-ориентирано програмиране в  .NET

Предефиниране на операторитеПредефиниране на операторите В В C#C# някои оператори могат да бъдат някои оператори могат да бъдат

предефинирани от програмистапредефинирани от програмиста Могат да се предефинират унарни и Могат да се предефинират унарни и

бинарни оператори действащи върху бинарни оператори действащи върху потребителски дефинирани типовепотребителски дефинирани типове

Не може да се променя вграденият Не може да се променя вграденият приоритет на операторитеприоритет на операторите

Не всички оператори са предефинируемиНе всички оператори са предефинируеми Дефинициите на операториДефинициите на оператори

Приличат на дефиниции на статичен методПриличат на дефиниции на статичен метод Използват ключовата дума Използват ключовата дума operatoroperator Приемат 1 или 2 параметъра, върху които Приемат 1 или 2 параметъра, върху които

действа съответния оператордейства съответния оператор

Page 74: Обектно-ориентирано програмиране в  .NET

Допустимо е предефиниране наДопустимо е предефиниране на унарните операториунарните оператори

бинарните операторибинарните оператори

оператори за преобразуване на типоператори за преобразуване на тип имплицитно преобразуванеимплицитно преобразуване (implicit type (implicit type

conversionconversion)) експлицитно преобразуванеексплицитно преобразуване (explicit type (explicit type

conversion)conversion)

Предефиниране на операторитеПредефиниране на операторите

++, , --, , !!, , ~~, , ++++, , ----, , truetrue и и falsefalse

++, , --, , **, , //, , %%, , &&, , ||, , ^̂, , <<<<, , >>>>,,====, , !=!=, , >>, , <<, , >=>= и и <=<=

Page 75: Обектно-ориентирано програмиране в  .NET

Предеф. на оператори – примерПредеф. на оператори – примерpublic struct Fraction public struct Fraction {{ private long mNumerator; private long mNumerator; // числител// числител private long mDenominator; private long mDenominator; // знаменател// знаменател

public Fraction(long aNumerator, long aDenominator) public Fraction(long aNumerator, long aDenominator) {{ // Cancel the fraction and make the denominator positive// Cancel the fraction and make the denominator positive long gcd = GreatestCommonDivisor(long gcd = GreatestCommonDivisor( aNumerator, aDenominator);aNumerator, aDenominator); mNumerator = aNumerator / gcd;mNumerator = aNumerator / gcd; mDenominator = aDenominator / gcd;mDenominator = aDenominator / gcd;

if (mDenominator < 0)if (mDenominator < 0) {{ mNumerator = -mNumerator;mNumerator = -mNumerator; mDenominator = -mDenominator;mDenominator = -mDenominator; }} }}

(примерът продължава)(примерът продължава)

Page 76: Обектно-ориентирано програмиране в  .NET

Предеф. на оператори – примерПредеф. на оператори – пример private static long GreatestCommonDivisor(private static long GreatestCommonDivisor( long aNumber1, long aNumber2) long aNumber1, long aNumber2) {{ aNumber1 = Math.Abs(aNumber1);aNumber1 = Math.Abs(aNumber1); aNumber2 = Math.Abs(aNumber2);aNumber2 = Math.Abs(aNumber2); while (aNumber1 > 0) while (aNumber1 > 0) {{ long newNumber1 = aNumber2 % aNumber1;long newNumber1 = aNumber2 % aNumber1; aNumber2 = aNumber1;aNumber2 = aNumber1; aNumber1 = newNumber1;aNumber1 = newNumber1; }} return aNumber2;return aNumber2; }}

public static Fraction operator +(Fraction aF1,public static Fraction operator +(Fraction aF1, Fraction aF2)Fraction aF2) {{ long num = aF1.mNumerator*aF2.mDenominator +long num = aF1.mNumerator*aF2.mDenominator + aF2.mNumerator*aF1.mDenominator;aF2.mNumerator*aF1.mDenominator; long denom = aF1.mDenominator*aF2.mDenominator;long denom = aF1.mDenominator*aF2.mDenominator; return new Fraction(num, denom);return new Fraction(num, denom); }} (примерът продължава)(примерът продължава)

Page 77: Обектно-ориентирано програмиране в  .NET

Предеф. на оператори – примерПредеф. на оператори – пример public static Fraction operator -(Fraction aF1,public static Fraction operator -(Fraction aF1, Fraction aF2)Fraction aF2) {{ long num = long num = aF1.mNumerator*aF2.mDenominator -aF1.mNumerator*aF2.mDenominator - aF2.mNumerator*aF1.mDenominator;aF2.mNumerator*aF1.mDenominator; long denom = aF1.mDenominator*aF2.mDenominator;long denom = aF1.mDenominator*aF2.mDenominator;

return new Fraction(num, denom);return new Fraction(num, denom); }}

public static Fraction operator *(Fraction aF1,public static Fraction operator *(Fraction aF1, Fraction aF2)Fraction aF2) {{ long num = aF1.mNumerator*aF2.mNumerator;long num = aF1.mNumerator*aF2.mNumerator; long denom = aF1.mDenominator*aF2.mDenominator;long denom = aF1.mDenominator*aF2.mDenominator;

return new Fraction(num, denom);return new Fraction(num, denom); }}

(примерът продължава)(примерът продължава)

Page 78: Обектно-ориентирано програмиране в  .NET

Предеф. на оператори – примерПредеф. на оператори – пример public static Fraction operator /(Fraction aF1,public static Fraction operator /(Fraction aF1, Fraction aF2)Fraction aF2) {{ long num = aF1.mNumerator*aF2.mDenominator;long num = aF1.mNumerator*aF2.mDenominator; long denom = aF1.mDenominator*aF2.mNumerator;long denom = aF1.mDenominator*aF2.mNumerator; return new Fraction(num, denom);return new Fraction(num, denom); }}

// Unary minus operator // Unary minus operator public static Fraction operator -(Fraction aFrac)public static Fraction operator -(Fraction aFrac) {{ long num = -aFrac.mNumerator;long num = -aFrac.mNumerator; long denom = aFrac.mDenominator;long denom = aFrac.mDenominator; return new Fraction(num, denom);return new Fraction(num, denom); }}

// Explicit conversion to double operator // Explicit conversion to double operator public static explicit operator double(Fractionpublic static explicit operator double(Fraction aFrac) aFrac) {{ return (double) return (double) aFrac.mNumerator / aFrac.mDenominator;aFrac.mNumerator / aFrac.mDenominator; }} (примерът продължава)(примерът продължава)

Page 79: Обектно-ориентирано програмиране в  .NET

Предеф. на оператори – примерПредеф. на оператори – пример // Operator ++ (the same for prefix and postfix form)// Operator ++ (the same for prefix and postfix form) public static Fraction operator ++(Fraction aFrac)public static Fraction operator ++(Fraction aFrac) {{ long num = aFrac.mNumerator + aFrac.mDenominator;long num = aFrac.mNumerator + aFrac.mDenominator; long denom = aFrac.mDenominator;long denom = aFrac.mDenominator; return new Fraction(num, denom);return new Fraction(num, denom); }}

// Operator -- (the same for prefix and postfix form)// Operator -- (the same for prefix and postfix form) public static Fraction operator --(Fraction aFrac)public static Fraction operator --(Fraction aFrac) {{ long num = aFrac.mNumerator - aFrac.mDenominator;long num = aFrac.mNumerator - aFrac.mDenominator; long denom = aFrac.mDenominator;long denom = aFrac.mDenominator; return new Fraction(num, denom);return new Fraction(num, denom); }}

public static bool operator true(Fraction aFraction) public static bool operator true(Fraction aFraction) {{ return aFraction.mNumerator != 0;return aFraction.mNumerator != 0; }}

public static bool operator false(Fraction aFraction) public static bool operator false(Fraction aFraction) {{ return aFraction.mNumerator == 0;return aFraction.mNumerator == 0; }}

Page 80: Обектно-ориентирано програмиране в  .NET

Предеф. на оператори – примерПредеф. на оператори – пример public static implicit operator Fraction(public static implicit operator Fraction( double aValue)double aValue) {{ double num = aValue;double num = aValue; long denom = 1;long denom = 1; while (num - Math.Floor(num) > 0) while (num - Math.Floor(num) > 0) {{ num = num * 10;num = num * 10; denom = denom * 10;denom = denom * 10; }}

return new Fraction((long)num, denom);return new Fraction((long)num, denom); }}

public override string ToString() public override string ToString() {{ return String.Format("{0}/{1}",return String.Format("{0}/{1}", mNumerator, mDenominator);mNumerator, mDenominator); }}}} (примерът продължава)(примерът продължава)

Page 81: Обектно-ориентирано програмиране в  .NET

Предеф. на оператори – примерПредеф. на оператори – пример

class FractionsTestclass FractionsTest{{ static void Main(string[] args)static void Main(string[] args) {{ Fraction f1 = (double)1/4;Fraction f1 = (double)1/4; Console.WriteLine("f1 = {0}", f1);Console.WriteLine("f1 = {0}", f1); Fraction f2 = (double)7/10;Fraction f2 = (double)7/10; Console.WriteLine("f2 = {0}", f2);Console.WriteLine("f2 = {0}", f2); Console.WriteLine("-f1 = {0}", -f1);Console.WriteLine("-f1 = {0}", -f1); Console.WriteLine("f1 + f2 = {0}", f1 + f2);Console.WriteLine("f1 + f2 = {0}", f1 + f2); Console.WriteLine("f1 - f2 = {0}", f1 - f2);Console.WriteLine("f1 - f2 = {0}", f1 - f2); Console.WriteLine("f1 * f2 = {0}", f1 * f2);Console.WriteLine("f1 * f2 = {0}", f1 * f2); Console.WriteLine("f1 / f2 = {0}", f1 / f2);Console.WriteLine("f1 / f2 = {0}", f1 / f2); Console.WriteLine("f1 / f2 as double = {0}",Console.WriteLine("f1 / f2 as double = {0}", (double)(f1 / f2));(double)(f1 / f2)); Console.WriteLine("-(f1+f2)*(f1-f2/f1) = {0}",Console.WriteLine("-(f1+f2)*(f1-f2/f1) = {0}", -(f1+f2)*(f1-f2/f1));-(f1+f2)*(f1-f2/f1)); }}}}

Page 82: Обектно-ориентирано програмиране в  .NET

Демонстрация Демонстрация #6#6 Проследяване изпълнението на Проследяване изпълнението на

предефинирани операторипредефинирани оператори

Page 83: Обектно-ориентирано програмиране в  .NET

Пространства от именаПространства от имена Пространствата от имена Пространствата от имена (namespaces)(namespaces)

Много приличат на пространствата от Много приличат на пространствата от имена в имена в C++ C++ и пакетите в и пакетите в JavaJava

Осигуряват логическо групиране на Осигуряват логическо групиране на съвкупности от дефиниции на типовесъвкупности от дефиниции на типове

Могат да съдържат в себе си класове, Могат да съдържат в себе си класове, структури, интерфейси, изброени типове и структури, интерфейси, изброени типове и други пространства от именадруги пространства от имена

Не могат да съдържат методи и данниНе могат да съдържат методи и данни Позволяват дефиниране на типове с Позволяват дефиниране на типове с

еднакви имена (стига да са в различни еднакви имена (стига да са в различни пространства)пространства)

Могат да са разположени в един или Могат да са разположени в един или няколко физически файланяколко физически файла

Page 84: Обектно-ориентирано програмиране в  .NET

Пространства от именаПространства от имена Пространствата от именаПространствата от имена могат да се могат да се

включват чрез директивата включват чрез директивата usingusing::

usingusing позволява директно използване позволява директно използване на всички типове от указанотона всички типове от указаното пространствопространство

Включването важи за текущия файлВключването важи за текущия файл Поставя се в началото на файлаПоставя се в началото на файла При включване на пространство от При включване на пространство от

имена с имена с usingusing неговите неговите подпространства не се включватподпространства не се включват

uusing System.Windows.Formssing System.Windows.Forms;;

Page 85: Обектно-ориентирано програмиране в  .NET

Пространства от именаПространства от имена Типовете, разположени в пространства от Типовете, разположени в пространства от

имена, могат да се използват и без имена, могат да се използват и без usingusing директивата, чрез пълното им имедирективата, чрез пълното им име::

Директивата Директивата usingusing може да създава може да създава псевдонимипсевдоними за пространствата:за пространствата:

using IO = System.IO;using IO = System.IO;using WinForms = System.Windows.Forms;using WinForms = System.Windows.Forms;

IO.StreamReader reader =IO.StreamReader reader = IO.File.OpenText("file.txt");IO.File.OpenText("file.txt");

WinForms.Form form = new WinForms.Form();WinForms.Form form = new WinForms.Form();

System.IO.StreamReader reader =System.IO.StreamReader reader = System.IO.File.OpenText("file.txt");System.IO.File.OpenText("file.txt");

Page 86: Обектно-ориентирано програмиране в  .NET

Пространства от имена – практикиПространства от имена – практики Препоръчвани практики при използване Препоръчвани практики при използване

на пространства от именана пространства от имена Разделяйте типовете от вашите приложения в Разделяйте типовете от вашите приложения в

пространства от имена винаги, когато са много на пространства от имена винаги, когато са много на брой (над 15-20)брой (над 15-20)

Категоризирайте логически типовете в Категоризирайте логически типовете в пространства според предназначението импространства според предназначението им

Ако типовете са твърде много, използвайте Ако типовете са твърде много, използвайте подпространства на вашите пространстваподпространства на вашите пространства

Разпределяйте всички публични типове във Разпределяйте всички публични типове във файлове съвпадащи с имената на типоветефайлове съвпадащи с имената на типовете

Файловете подреждайте в директории, Файловете подреждайте в директории, съответстващи на namespace-ите имсъответстващи на namespace-ите им

Структурата на директориите от сорс-кода на Структурата на директориите от сорс-кода на проекта ви трябва да отразява структурата на проекта ви трябва да отразява структурата на дефинираните пространства от именадефинираните пространства от имена

Page 87: Обектно-ориентирано програмиране в  .NET

Пространства от имена – примери Пространства от имена – примери namespace SofiaUniversity.Datanamespace SofiaUniversity.Data{{ public public struct Faculty struct Faculty {{ // ...// ... }}

public public class Studentclass Student {{ // ...// ... }}

public public class Professor class Professor {{ // ...// ... }}

public public enum Specialty enum Specialty {{ // ...// ... }}}}

Page 88: Обектно-ориентирано програмиране в  .NET

Пространства от имена – примери Пространства от имена – примери namespace SofiaUniversity.UInamespace SofiaUniversity.UI{{ public public class StudentAdminFormclass StudentAdminForm : System.Windows.Forms.Form: System.Windows.Forms.Form {{ // ...// ... }}

public public class ProfessorAdminForm : System.Windows.Forms.Formclass ProfessorAdminForm : System.Windows.Forms.Form {{ // ...// ... }}}}

namespace SofiaUniversity namespace SofiaUniversity {{ public class AdministrationSystempublic class AdministrationSystem {{ public static void Main()public static void Main() {{ // ...// ... }} }}}}

Page 89: Обектно-ориентирано програмиране в  .NET

Пространства от имена –Пространства от имена – примерипримери

Препоръчвана структура на директориите Препоръчвана структура на директориите и разполагане на класовете в тяхи разполагане на класовете в тях

Page 90: Обектно-ориентирано програмиране в  .NET

Управление на изключениятаУправление на изключенията Изключенията в Изключенията в .NET .NET са класическа са класическа

имплементация на изключенията от ООПимплементация на изключенията от ООП Предоставят мощен механизъм за Предоставят мощен механизъм за

централизирана обработка на грешки и централизирана обработка на грешки и необичайни ситуациинеобичайни ситуации

Заместват процедурно-ориентирания Заместват процедурно-ориентирания подход, при който всяка функция връща подход, при който всяка функция връща код за грешкакод за грешка

Улесняват писането и поддръжката на Улесняват писането и поддръжката на надежден програмен коднадежден програмен код

Позволяват проблемните ситуации да се Позволяват проблемните ситуации да се обработват на много ниваобработват на много нива

Page 91: Обектно-ориентирано програмиране в  .NET

В В C# C# изключенията могат да се прихващат изключенията могат да се прихващат с програмната конструкцияс програмната конструкция

Изразът Изразът catchcatch може да присъства няколко може да присъства няколко пъти съответно за различните изключенияпъти съответно за различните изключения

Голяма част от стандартните методи от Голяма част от стандартните методи от Framework Class Library Framework Class Library предизвикват предизвикват изключения при проблемни ситуацииизключения при проблемни ситуации

Прихващане на изключенияПрихващане на изключения

trytry{{ // Do some work that can raise an exception// Do some work that can raise an exception}}catch (catch (SomeExceptionSomeException)){{ // Handle the caught exception// Handle the caught exception}}

Page 92: Обектно-ориентирано програмиране в  .NET

Прихващане на изключения – примерПрихващане на изключения – пример

static void Main(string[] args)static void Main(string[] args){{ string s = Console.ReadLine();string s = Console.ReadLine();

trytry {{ Int32.Parse(s);Int32.Parse(s); Console.WriteLine(Console.WriteLine( "You entered valid Int32 number {0}.", s);"You entered valid Int32 number {0}.", s); }} catch (FormatException)catch (FormatException) {{ Console.WriteLine("Invalid integer number!");Console.WriteLine("Invalid integer number!"); }} catch (OverflowException)catch (OverflowException) {{ Console.WriteLine(Console.WriteLine( "The number is too big to fit in Int32!");"The number is too big to fit in Int32!"); }}}}

Page 93: Обектно-ориентирано програмиране в  .NET

Демонстрация Демонстрация #7#7 Проследяване на прихващането на Проследяване на прихващането на

изключенияизключения

Page 94: Обектно-ориентирано програмиране в  .NET

Изключенията в Изключенията в .NET Framework.NET Framework са обекти са обекти Класът Класът System.ExceptionSystem.Exception е базов клас за е базов клас за

всички изключения в всички изключения в CLRCLR Класът Класът System.ExceptionSystem.Exception съдържа съдържа

информация за настъпилата грешка или информация за настъпилата грешка или необичайна ситуациянеобичайна ситуация MessageMessage – – текстово описание на грешкататекстово описание на грешката StackTraceStackTrace – – текстова визуализация на текстова визуализация на

състоянието на стека в момента на възникване състоянието на стека в момента на възникване на изключениетона изключението

InnerExceptionInnerException – – изключение, което е изключение, което е причина за възникване на текущото причина за възникване на текущото изключение (ако има такова)изключение (ако има такова)

Класът Класът System.ExceptionSystem.Exception

Page 95: Обектно-ориентирано програмиране в  .NET

Свойства на изключенията – примерСвойства на изключенията – пример

class ExceptionsTestclass ExceptionsTest{{ public static void CauseFormatException() public static void CauseFormatException() {{ string s = "an invalid number";string s = "an invalid number"; Int32.Parse(s);Int32.Parse(s); }}

static void Main(string[] args)static void Main(string[] args) {{ trytry {{ CauseFormatException();CauseFormatException(); }} catch (FormatException fe)catch (FormatException fe) {{ Console.Error.WriteLine(Console.Error.WriteLine( "Exception caught: {0}\n{1}","Exception caught: {0}\n{1}", fe.Message, fe.StackTrace);fe.Message, fe.StackTrace); }} }}}}

Page 96: Обектно-ориентирано програмиране в  .NET

Свойства на изключениятаСвойства на изключенията Свойството Свойството MessageMessage на изключенията на изключенията

дава кратко описание на проблемадава кратко описание на проблема Свойството Свойството StackTraceStackTrace е изключително е изключително

полезно при идентифициране на полезно при идентифициране на причината за изключението:причината за изключението:

Exception caught: Input string was not in a correct Exception caught: Input string was not in a correct format.format.

at System.Number.ParseInt32(String s, at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)NumberStyles style, NumberFormatInfo info)

at System.Int32.Parse(String s)at System.Int32.Parse(String s)

at ExceptionsTest.CauseFormatException() in c:\at ExceptionsTest.CauseFormatException() in c:\consoleapplication1\exceptionstest.cs:line 8consoleapplication1\exceptionstest.cs:line 8

at ExceptionsTest.Main(String[] args) in c:\at ExceptionsTest.Main(String[] args) in c:\consoleapplication1\exceptionstest.cs:line 15consoleapplication1\exceptionstest.cs:line 15

Page 97: Обектно-ориентирано програмиране в  .NET

Свойства на изключениятаСвойства на изключенията Имената на файловете и номерата на Имената на файловете и номерата на

редовете са достъпни само ако сме редовете са достъпни само ако сме компилирали с компилирали с Debug Debug информацияинформация

Ако компилираме примера в Ако компилираме примера в Release Release режим, ще получим съвсем различена режим, ще получим съвсем различена информация от свойството информация от свойството StackTraceStackTrace::

Exception caught: Input string was not in a correct Exception caught: Input string was not in a correct format.format. at System.Number.ParseInt32(String s, NumberStyles at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)style, NumberFormatInfo info) at ExceptionsTest.Main(String[] args)at ExceptionsTest.Main(String[] args)

Page 98: Обектно-ориентирано програмиране в  .NET

Изключенията са класове – могат да Изключенията са класове – могат да се наследяват и да образуват се наследяват и да образуват йерархии. Например:йерархии. Например:

Йерархия на изключенияЙерархия на изключения

System.Exception

System.SystemException System.ApplicationException

System.NullReferenceException System.FormatException

System.ArithmeticException

System.DivideByZeroException System.OverflowException

SofiaUniversity.InvalidStudentException

Page 99: Обектно-ориентирано програмиране в  .NET

Видове изключенияВидове изключения Всички изключения в .NET наследяват Всички изключения в .NET наследяват

базовия клас базовия клас System.ExceptionSystem.Exception Системните изключения наследяват класа Системните изключения наследяват класа

System.SystemExceptionSystem.SystemException, например:, например: System.ArithmeticExceptionSystem.ArithmeticException System.ArgumentExceptionSystem.ArgumentException System.NullReferenceExceptionSystem.NullReferenceException System.OutOfMemoryExceptionSystem.OutOfMemoryException System.StackOverflowExceptionSystem.StackOverflowException

Изключенията, дефинирани от Изключенията, дефинирани от потребителя трябва да наследяват класа потребителя трябва да наследяват класа System.ApplicationExceptionSystem.ApplicationException

Page 100: Обектно-ориентирано програмиране в  .NET

Прихващане на изключенияПрихващане на изключения При прихващане на изключения от даден При прихващане на изключения от даден

клас се прихващат и изключенията от клас се прихващат и изключенията от всички негови наследницивсички негови наследници

Например конструкциятаНапример конструкцията

прихваща освен прихваща освен ArithmeticExceptionArithmeticException и и изключенията изключенията DivideByZeroExceptionDivideByZeroException и и OverflowExceptionOverflowException

trytry{{ // Do some works that can raise an exception// Do some works that can raise an exception}}catch (catch (System.ArithmeticExceptionSystem.ArithmeticException)){{ // Handle the caught arithmetic exception// Handle the caught arithmetic exception}}

Page 101: Обектно-ориентирано програмиране в  .NET

Открийте грешката в примераОткрийте грешката в примера!!static void Main(string[] args)static void Main(string[] args){{ string s = Console.ReadLine();string s = Console.ReadLine();

trytry {{ Int32.Parse(s);Int32.Parse(s); }} catch (Exception)catch (Exception) {{ Console.WriteLine("Can not parse the number!");Console.WriteLine("Can not parse the number!"); }} catch (FormatException)catch (FormatException) {{ Console.WriteLine("Invalid integer number!");Console.WriteLine("Invalid integer number!"); }} catch (OverflowException)catch (OverflowException) {{ Console.WriteLine(Console.WriteLine( "The number is too big to fit in Int32!");"The number is too big to fit in Int32!"); }}}}

Page 102: Обектно-ориентирано програмиране в  .NET

Открийте грешката в примераОткрийте грешката в примера!!static void Main(string[] args)static void Main(string[] args){{ string s = Console.ReadLine();string s = Console.ReadLine();

trytry {{ Int32.Parse(s);Int32.Parse(s); }} catch (Exception)catch (Exception) // Трябва да е най-накрая// Трябва да е най-накрая {{ Console.WriteLine("Can not parse the number!");Console.WriteLine("Can not parse the number!"); }} catch (FormatException)catch (FormatException) // Този код е недостижим// Този код е недостижим {{ Console.WriteLine("Invalid integer number!");Console.WriteLine("Invalid integer number!"); }} catch (OverflowException)catch (OverflowException) // Този код е недостижим// Този код е недостижим {{ Console.WriteLine(Console.WriteLine( "The number is too big to fit in Int32!");"The number is too big to fit in Int32!"); }}}}

Page 103: Обектно-ориентирано програмиране в  .NET

Прихващане на всички изключенияПрихващане на всички изключения

Управляваният .NET код може да Управляваният .NET код може да предизвиква само изключения, предизвиква само изключения, наследници на наследници на System.ExceptionSystem.Exception

Неуправляваният код може да Неуправляваният код може да предизвиква и други изключенияпредизвиква и други изключения

За прихващане на всички изключения в За прихващане на всички изключения в C# се използва конструкцията:C# се използва конструкцията:

trytry{{ // Do some works that can raise any exception// Do some works that can raise any exception}}catchcatch{{ // Handle the caught exception// Handle the caught exception}}

Page 104: Обектно-ориентирано програмиране в  .NET

Предизвикване на изключенияПредизвикване на изключения Предизвикването (хвърлянето) на Предизвикването (хвърлянето) на

изключения (изключения (throwing, raising exceptions)throwing, raising exceptions) Има за цел да уведоми извикващия код за Има за цел да уведоми извикващия код за

възникването на даден проблемвъзникването на даден проблем Използва се в случай на настъпване на грешка Използва се в случай на настъпване на грешка

или необичайна ситуацияили необичайна ситуация Предизвиква прекратяване изпълнението на Предизвиква прекратяване изпълнението на

програмата и обхождане на стека до достигане програмата и обхождане на стека до достигане на на catchcatch блок за съответното изключениеблок за съответното изключение

В В C# C# се извършва с оператора се извършва с оператора throwthrow Обикновено изисква създаване на обект от Обикновено изисква създаване на обект от

някой наследник на класа някой наследник на класа System.ExceptionSystem.Exception, , в който се поставя описание на проблемав който се поставя описание на проблема

В В catchcatch блокове хванатите изключения блокове хванатите изключения могат да се хвърлят отновомогат да се хвърлят отново

Page 105: Обектно-ориентирано програмиране в  .NET

Предизвикване на изключения – примерПредизвикване на изключения – пример public static double Sqrt(double aValue)public static double Sqrt(double aValue){{ if (aValue < 0)if (aValue < 0) throw new System.ArgumentOutOfRangeException(throw new System.ArgumentOutOfRangeException( "Sqrt for negative numbers "Sqrt for negative numbers is is undefinedundefined!!");"); return Math.Sqrt(aValue);return Math.Sqrt(aValue);}}

static void Main(string[] args)static void Main(string[] args){{ trytry {{ Sqrt(-1);Sqrt(-1); }} catch (ArgumentOutOfRangeException ex)catch (ArgumentOutOfRangeException ex) {{ Console.Error.WriteLine("Error: " + ex.Message);Console.Error.WriteLine("Error: " + ex.Message); throw;throw; }}}}

Page 106: Обектно-ориентирано програмиране в  .NET

Собствени класове изключенияСобствени класове изключения .NET .NET програмистите могат да дефинират програмистите могат да дефинират

собствени класове изключения и да собствени класове изключения и да създават класови йерархии с тяхсъздават класови йерархии с тях

Това осигурява много голяма гъвкавост Това осигурява много голяма гъвкавост при управлението на грешки и необичайни при управлението на грешки и необичайни ситуацииситуации

За дефиниране на собствено изключениеЗа дефиниране на собствено изключение се наследява класа се наследява класа

System.ApplicationExceptionSystem.ApplicationException създават му се подходящи конструкторисъздават му се подходящи конструктори могат да му се добавят допълнителни могат да му се добавят допълнителни

свойства, даващи информация за проблемасвойства, даващи информация за проблема може да му се зададе може да му се зададе InnerExceptionInnerException

Page 107: Обектно-ориентирано програмиране в  .NET

Собствени изключенияСобствени изключения – – пример примерclass ParseFileException : ApplicationException class ParseFileException : ApplicationException {{ private string mFileName;private string mFileName; private long mLineNumber;private long mLineNumber;

public string FileName public string FileName {{ get get {{ return mFileName;return mFileName; }} }}

public long LineNumberpublic long LineNumber {{ get get {{ return mLineNumber;return mLineNumber; }} }} ((примерът продължава)примерът продължава)

Page 108: Обектно-ориентирано програмиране в  .NET

Собствени изключенияСобствени изключения – – пример пример public ParseFileException(string aMessage,public ParseFileException(string aMessage, string aFileName,string aFileName, long aLineNumber,long aLineNumber, Exception aCauseException) : base(aMessage,Exception aCauseException) : base(aMessage, aCauseException)aCauseException) {{ mFileName = aFileName;mFileName = aFileName; mLineNumber = aLineNumber;mLineNumber = aLineNumber; }}

public ParseFileException(string aMessage,public ParseFileException(string aMessage, stringstring aFileName,aFileName, Exception aCauseException)Exception aCauseException) :: this(this( aMessage, aFileName, 0, aCauseException)aMessage, aFileName, 0, aCauseException) {{ }}

public ParseFileException(string aMessage, public ParseFileException(string aMessage, string aFileName) :string aFileName) : this(aMessage, aFileName, null)this(aMessage, aFileName, null) {{ }}}} (примерът продължава)(примерът продължава)

Page 109: Обектно-ориентирано програмиране в  .NET

Собствени изключенияСобствени изключения – – пример примерstatic long CalculateSumOfLines(string aFileName)static long CalculateSumOfLines(string aFileName){{ StreamReader inF;StreamReader inF; trytry {{ inF = File.OpenText(aFileName);inF = File.OpenText(aFileName); }} catch (IOException ioe)catch (IOException ioe) {{ throw new ParseFileException(String.Format(throw new ParseFileException(String.Format( "Can not open the file {0} for reading.", "Can not open the file {0} for reading.", aFileName), aFileName, ioe);aFileName), aFileName, ioe); }}

trytry {{ long sum = 0;long sum = 0; long lineNumber = 0;long lineNumber = 0; while (true)while (true) {{ (примерът продължава)(примерът продължава)

Page 110: Обектно-ориентирано програмиране в  .NET

Собствени изключенияСобствени изключения – – пример пример lineNumber++;lineNumber++; string line;string line; trytry {{ line = inF.ReadLine();line = inF.ReadLine(); }} catch (IOException ioe) catch (IOException ioe) {{ throw new ParseFileException(throw new ParseFileException( "Error reading from file.", "Error reading from file.", aFileName, lineNumber, ioe);aFileName, lineNumber, ioe); }}

if (line == null) if (line == null) break; break; // end of file reached// end of file reached

trytry {{ sum += Int32.Parse(line);sum += Int32.Parse(line); }} (примерът продължава)(примерът продължава)

Page 111: Обектно-ориентирано програмиране в  .NET

Собствени изключенияСобствени изключения – – пример пример catch (SystemException se)catch (SystemException se) {{ throw newthrow new ParseFileException(String.Format(ParseFileException(String.Format( "Error parsing line '{0}'.", line),"Error parsing line '{0}'.", line), aFileName, lineNumber, se);aFileName, lineNumber, se); }} }}

return sum;return sum; }} finallyfinally {{ inF.Close();inF.Close(); }}}}

static void Main(string[] args)static void Main(string[] args){{ long sumOfLines = CalculateSumOfLines(@"c:\test.txt");long sumOfLines = CalculateSumOfLines(@"c:\test.txt"); Console.WriteLine("ThConsole.WriteLine("Thee sum of lines={0}", sumOfLines); sum of lines={0}", sumOfLines);}}

Page 112: Обектно-ориентирано програмиране в  .NET

Конструкцията Конструкцията try-finallytry-finally Програмната конструкцияПрограмната конструкция

осигурява гарантирано изпълнение на осигурява гарантирано изпълнение на зададен програмен блок независимо дали зададен програмен блок независимо дали в блока преди него възникне изключение в блока преди него възникне изключение или неили не

Използва се за изпълнение на почистващ Използва се за изпълнение на почистващ код, например освобождаване на ресурсикод, например освобождаване на ресурси

trytry{{ // Do some work that can raise an exception// Do some work that can raise an exception}}finallyfinally{{ // This block will always execute// This block will always execute}}

Page 113: Обектно-ориентирано програмиране в  .NET

Try-finally – Try-finally – примерпример/// <summary>/// <summary>/// Returns the number of the first line from the given text file/// Returns the number of the first line from the given text file/// that contains given pattern or -1 if such line is not /// that contains given pattern or -1 if such line is not foundfound/// </summary>/// </summary>static int FindInTextFile(string aPattern, string aFileName)static int FindInTextFile(string aPattern, string aFileName){{ int lineNumber = 0;int lineNumber = 0; StreamReader inF = File.OpenText(aFileName);StreamReader inF = File.OpenText(aFileName); trytry {{ while (true)while (true) {{ string line = inF.ReadLine();string line = inF.ReadLine(); if (line == null) break; if (line == null) break; // end of file reached// end of file reached lineNumber++;lineNumber++; if (line.IndexOf(aPattern) != -1)if (line.IndexOf(aPattern) != -1) return lineNumber;return lineNumber; }} return -1;return -1; }} finallyfinally {{ inF.Close(); inF.Close(); // The file will // The file will never remain openednever remain opened }}}}

Page 114: Обектно-ориентирано програмиране в  .NET

Изключения – практикиИзключения – практики Препоръчвани практики при Препоръчвани практики при

управлението на изключенияуправлението на изключения CatchCatch блоковете трябва да са блоковете трябва да са

подредени така, че да започват от подредени така, че да започват от изключенията най-ниско в йерархията и изключенията най-ниско в йерархията и да продължават с по-общитеда продължават с по-общите

Всеки Всеки catchcatch блок трябва да прихваща блок трябва да прихваща само изключенията, които очаква (които само изключенията, които очаква (които знае как да обработва), а не всичкизнае как да обработва), а не всички

Не е правилно да прихващате всички Не е правилно да прихващате всички изключения, без да ви интересува типа изключения, без да ви интересува типа им. Избягвайте конструкциите им. Избягвайте конструкциите catch catch (Exception)(Exception) {…}{…} и просто и просто catchcatch {…}{…}

Page 115: Обектно-ориентирано програмиране в  .NET

Изключения – практикиИзключения – практики Препоръчвани практики при Препоръчвани практики при

управлението на изключенияуправлението на изключения При дефиниране на собствени При дефиниране на собствени

изключения наследявайте изключения наследявайте System.ApplicationExceptionSystem.ApplicationException, а не , а не директно директно System.ExceptionSystem.Exception..

Имената на класовете на всички Имената на класовете на всички изключения трябва завършват на изключения трябва завършват на ExceptionException, напр. , напр. OrderExceptionOrderException

При създаване на инстанция на При създаване на инстанция на изключение винаги й подавайте в изключение винаги й подавайте в конструктора подходящо съобщениеконструктора подходящо съобщение

Page 116: Обектно-ориентирано програмиране в  .NET

Изключения – практикиИзключения – практики Препоръчвани практики при Препоръчвани практики при

управлението на изключенияуправлението на изключения Съобразявайте се, че изключенията Съобразявайте се, че изключенията

могат да намалят значително могат да намалят значително производителността на приложениетопроизводителността на приложението

Имайте предвид, че някои изключения Имайте предвид, че някои изключения могат да възникват по всяко време без могат да възникват по всяко време без да ги очаквате (например да ги очаквате (например System. System. OutOfMemoryExceptionOutOfMemoryException))

Хвърляйте изключения само при Хвърляйте изключения само при ситуации, които наистина са ситуации, които наистина са изключителни и трябва да се обработятизключителни и трябва да се обработят

Page 117: Обектно-ориентирано програмиране в  .NET

Обектно-ориентираноОбектно-ориентиранопрограмиране в програмиране в .NET.NET

Въпроси?Въпроси?

Page 118: Обектно-ориентирано програмиране в  .NET

УпражненияУпражнения1.1. Формулирайте основните принципи на обектно-Формулирайте основните принципи на обектно-

ориентираното програмиране. Дефинирайте ориентираното програмиране. Дефинирайте понятията клас, обект, атрибут, метод, понятията клас, обект, атрибут, метод, енкапсулация на данните, абстракция на данните и енкапсулация на данните, абстракция на данните и действията, наследяване, полиморфизъм.действията, наследяване, полиморфизъм.

2.2. Дефинирайте клас Дефинирайте клас StudentStudent, , който съдържа като който съдържа като privateprivate полета данните за един студент – тритеполета данните за един студент – трите имена, ЕГН, адрес (постоянен и временен), имена, ЕГН, адрес (постоянен и временен), телефон (стационарен и мобилен), телефон (стационарен и мобилен), e-mail, e-mail, курс, курс, специалност, ВУЗ, факултет и т.н. Използвайте специалност, ВУЗ, факултет и т.н. Използвайте изброен тип (изброен тип (enumeration)enumeration) за специалностите, ВУЗ- за специалностите, ВУЗ-овете и факултетите.овете и факултетите.

3.3. Дефинирайте няколко конструктора за класа Дефинирайте няколко конструктора за класа StudentStudent, които приемат различни параметри , които приемат различни параметри (пълните данни за студента или само част от тях). (пълните данни за студента или само част от тях). Неизвестните данни запълвайте с Неизвестните данни запълвайте с 0 0 или или null.null.

Page 119: Обектно-ориентирано програмиране в  .NET

УпражненияУпражнения4.4. Добавете в класа Добавете в класа StudentStudent статично поле, което статично поле, което

съдържа количеството инстанции, създадени от съдържа количеството инстанции, създадени от този клас от стартирането на програмата до този клас от стартирането на програмата до момента. За целта променете по подходящ начин момента. За целта променете по подходящ начин конструкторите на класа.конструкторите на класа.

5.5. Добавете имплементация на виртуалния метод Добавете имплементация на виртуалния метод Equals(Equals(……)) от класа от класа System.ObjectSystem.Object, който , който сравнява дали два студента са еднакви. сравнява дали два студента са еднакви. Сравняването трябва да става чрез проверка за Сравняването трябва да става чрез проверка за еднаквост на стойностите от всички полета.еднаквост на стойностите от всички полета.

6.6. Направете класа Направете класа StudentStudent структура. Какви са структура. Какви са разликите между клас и структура?разликите между клас и структура?

7.7. Направете нов клас Направете нов клас StudentsTestStudentsTest, който има , който има статичен метод за отпечатване на информацията статичен метод за отпечатване на информацията за един или няколко студента. Методът трябва да за един или няколко студента. Методът трябва да приема променлив брой параметри.приема променлив брой параметри.

Page 120: Обектно-ориентирано програмиране в  .NET

УпражненияУпражнения8.8. Добавете към класа Добавете към класа StudentsTestStudentsTest няколко няколко

статични полета от тип статични полета от тип StudentStudent и статичен и статичен конструктор, който създава няколко инстанции на конструктор, който създава няколко инстанции на структурата структурата StudentStudent с някакви примерни данни и с някакви примерни данни и ги записва в съответните статични полета.ги записва в съответните статични полета.

9.9. Създайте интерфейс Създайте интерфейс IAnimalIAnimal, който моделира , който моделира животните от реалния свят. Добавете към него животните от реалния свят. Добавете към него метод метод Talk()Talk(), който отпечатва на конзолата , който отпечатва на конзолата специфичен за животното писъкспецифичен за животното писък, , булево булево свойство свойство PredatorPredator,, което връща дали животното което връща дали животното е хищник и булев метод е хищник и булев метод CouldEat(IAnimal)CouldEat(IAnimal), , който връща дали животното се храни с който връща дали животното се храни с посоченото друго животно. За проверка на типа посоченото друго животно. За проверка на типа животно използвайте оператора животно използвайте оператора isis..

10.10. Създайте класове, които имплементират Създайте класове, които имплементират интерфейса интерфейса IAnimalIAnimal и моделират животните и моделират животните "куче" и "жаба"."куче" и "жаба".

Page 121: Обектно-ориентирано програмиране в  .NET

УпражненияУпражнения11.11. Създайте абстрактен клас Създайте абстрактен клас CatCat за животното за животното

"котка", който имплементира частично "котка", който имплементира частично IAnimalIAnimal

12.12. Създайте класове Създайте класове KittenKitten и и TomcatTomcat за животните за животните "малко котенце" и "стар котарак", които "малко котенце" и "стар котарак", които наследяват абстрактния клас наследяват абстрактния клас CatCat и и имплементират неговите абстрактни методиимплементират неговите абстрактни методи

13.13. Създайте клас Създайте клас CrazyCatCrazyCat, наследник на класа , наследник на класа TomcatTomcat за животното "луда котка", което издава за животното "луда котка", което издава кучешки звуцикучешки звуци при извикване на виртуалния при извикване на виртуалния метод метод Talk()Talk()..

14.14. Реализирайте клас със статичен метод, който Реализирайте клас със статичен метод, който инстанцира по един обект от всеки от класовете, инстанцира по един обект от всеки от класовете, поддържащи интерфейса поддържащи интерфейса IAnimalIAnimal и им извиква и им извиква виртуалния метод виртуалния метод Talk()Talk() през интерфейса през интерфейса IIAAnimalnimal. Съответстват ли си животинските . Съответстват ли си животинските писъци с животните, които ги издават?писъци с животните, които ги издават?

Page 122: Обектно-ориентирано програмиране в  .NET

УпражненияУпражнения15.15. Направете всички полета на структурата Направете всички полета на структурата StudentStudent

с видимост с видимост privateprivate. Добавете дефиниции на . Добавете дефиниции на свойства за четене и писане за всички полета.свойства за четене и писане за всички полета.

16.16. Направете свойството за достъп до ЕГН полето Направете свойството за достъп до ЕГН полето от структурата от структурата StudentStudent само за четене. само за четене. Направете и полето за ЕГН само за четене. ННаправете и полето за ЕГН само за четене. Нее забравяйте задължително да го инициализирате забравяйте задължително да го инициализирате от всички конструктори на структурата.от всички конструктори на структурата.

17.17. Напишете клас, който представя комплексни Напишете клас, който представя комплексни числа и реализира основните операции с тях. числа и реализира основните операции с тях. Класът трябва да съдържа като Класът трябва да съдържа като privateprivate полета полета реална и имагинерна част за комплексното число реална и имагинерна част за комплексното число и да предефинира операторите за събиране, и да предефинира операторите за събиране, изваждане, умножение и деление. Реализирайте изваждане, умножение и деление. Реализирайте виртуалния метод виртуалния метод ToString()ToString() за улеснение при за улеснение при отпечатването на комплексни числа.отпечатването на комплексни числа.

Page 123: Обектно-ориентирано програмиране в  .NET

УпражненияУпражнения18.18. Реализирайте допълнителнРеализирайте допълнителнии оператори за оператори за

имплицитно преобразуване на имплицитно преобразуване на doubledouble в в комплексно число и експлицитно преобразуване комплексно число и експлицитно преобразуване на комплексно число в на комплексно число в doubledouble..

19.19. Добавете индексатор в класа за комплексни Добавете индексатор в класа за комплексни числа, който по индекс числа, който по индекс 00 връща реалната част, а връща реалната част, а по индекс по индекс 11 връща имагинерната част на дадено връща имагинерната част на дадено комплексно число.комплексно число.

20.20. Организирайте всички дефинирани типове в Организирайте всички дефинирани типове в няколко пространства от имена.няколко пространства от имена.

21.21. Направете конструкторите на структурата Направете конструкторите на структурата StudentStudent да подава изключения при некоректно да подава изключения при некоректно зададени данни за студент. Дефинирайте зададени данни за студент. Дефинирайте подходящи собствени класове за изключенията.подходящи собствени класове за изключенията.

22.22. Добавете предизвикване на изключения в класа Добавете предизвикване на изключения в класа за комплексни числа, където е необходимо.за комплексни числа, където е необходимо.

Page 124: Обектно-ориентирано програмиране в  .NET

Jeffrey Richter, Applied Microsoft .NET Framework Jeffrey Richter, Applied Microsoft .NET Framework Programming, Microsoft Press, 2002, ISBN Programming, Microsoft Press, 2002, ISBN 07356142290735614229

Tom Archer, Andrew Whitechapel, Inside C#, 2-nd Tom Archer, Andrew Whitechapel, Inside C#, 2-nd Edition, Microsoft Press, 2002, ISBN Edition, Microsoft Press, 2002, ISBN 07356164850735616485

MSDN Training, Programming C# (MOC 2124C), MSDN Training, Programming C# (MOC 2124C), Module Module 55: : Methods and ParametersMethods and Parameters

MSDN Training, Programming C# (MOC 2124C), MSDN Training, Programming C# (MOC 2124C), Module Module 77: : Essentials of Object-Oriented Essentials of Object-Oriented ProgrammingProgramming

MSDN Training, Programming C# (MOC 2124C), MSDN Training, Programming C# (MOC 2124C), Module Module 99: : Creating and Destroying ObjectsCreating and Destroying Objects

MSDN Training, Programming C# (MOC 2124C), MSDN Training, Programming C# (MOC 2124C), Module Module 1010: : Inheritance in C#Inheritance in C#

Използвана литератураИзползвана литература

Page 125: Обектно-ориентирано програмиране в  .NET

MSDN Training, Programming C# (MOC 2124C), MSDN Training, Programming C# (MOC 2124C), Module 12: Operators, Delegates, and EventsModule 12: Operators, Delegates, and Events

MSDN Training, Programming C# (MOC 2124C), MSDN Training, Programming C# (MOC 2124C), Module 13: Properties and IndexersModule 13: Properties and Indexers

MSDN Library – MSDN Library – http://msdn.microsoft.comhttp://msdn.microsoft.com

Използвана литератураИзползвана литература