Да си припомним: какво са класовете и обектите?


Винаги, когато съществува възможност, използвайте из­броен тип вместо множество константи де­кларирани в някакъв клас



страница72/84
Дата03.01.2022
Размер0.54 Mb.
#112941
ТипПрограма
1   ...   68   69   70   71   72   73   74   75   ...   84
Класове
Свързани:
Изпитна тема1, Изпитна тема2
Винаги, когато съществува възможност, използвайте из­броен тип вместо множество константи де­кларирани в някакъв клас.

Преди да приключим секцията за изброените типове, трябва да споменем, че изброените типове трябва да се използват много внимателно при работа с конструкцията switch-case. Например, ако някой ден, собстве­никът на заведението купи много големи чаши за кафе, ще трябва да добавим нова константа в списъка с константи на изброения тип CoffeeSize, нека я наречем Overwhelming:

CoffeeSize.cs

public enum CoffeeSize

{

Small=100, Normal=150, Double=300, Overwhelming=600



}

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

Това, което трябва да направим, за да решим този проблем е да добавим ново case-условие, което да отразява новата константа в изброения тип CoffeeSize.





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

Вътрешни класове (nested classes)

В C# вътрешен (nested) се нарича клас, който е деклариран вътре в тялото на друг клас. Съответно, клас, който обвива вътрешен клас се нарича външен клас (outer class).

Основните причини да се декларира един клас в друг са следните:

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

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

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

Декларация на вътрешни класове

Вътрешните класове се декларират по същия начин, както нормалните класове, но се разполагат вътре в друг клас. Позволените модификатори в декларацията на класа са следните:

1.  public – вътрешният клас е достъпен от кое да е асембли.

2.  internal – вътрешният клас е достъпен в текущото асембли, в което се намира външния клас.

3.  private – достъпът е ограничен само до класа, който съдържа вътрешния клас.

4.  static – вътрешният клас съдържа само статични членове.

Има още четири позволени модификатора – abstract, protected, protected internal, sealed и unsafe, които са извън обхвата и темати­ката на тази глава и няма да бъдат разглеждани тук.

Ключовата дума this за един вътрешен клас, притежава връзка единствено към вътрешния клас, но не и към външния. Полетата на външния клас не могат да бъдат достъпвани използвайки референцията this. Ако е необходимо полетата на външния клас да бъдат достъпвани от вътрешния, трябва при създаването на вътрешния клас да се подаде референция към външния клас.

Статичните членове (полета, методи, свойства) на външния клас са достъпни от вътрешния независимо от нивото си на достъп.

Вътрешни класове – пример

Нека разгледаме следния пример:

OuterClass.cs

public class OuterClass

{

private string name;



 

private OuterClass(string name)

{

this.name = name;



}

 

private class NestedClass



{

private string name;

private OuterClass parent;

 

public InnerClass(OuterClass parent, string name)



{

this.parent = parent;

this.name = name;

}

 



public void PrintNames()

{

Console.WriteLine("Nested name: " + this.name);



Console.WriteLine("Outer name: " + this.parent.name);

}

}



 

public static void Main()

{

OuterClass outerClass = new OuterClass("outer");



NestedClass nestedClass = new

OuterClass.InnerClass(outerClass, "nested");

nestedClass.PrintNames();

}

}



В примера външният клас OuterClass дефинира в себе си като член класа InnerClass. Нестатичните методи на вътрешния клас имат достъп както до собствената си инстанция this, така и до инстанцията на външния клас parent (чрез синтаксиса this.parent, ако референцията parent е доба­вена от програмиста). В примера при създаването на вътрешния клас на конструктора му се подава parent референцията на външния клас.

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



Inner name: inner

Outer name: outer



Употреба на вътрешни класове

Нека разгледаме един пример. Нека имаме клас за кола – Car. Всяка кола има двигател, както и врати. За разлика от вратите на колата обаче, двигателят няма смисъл разглеждан като елемент извън колата, тъй като без него, колата не може да работи, т.е. имаме композиция (вж. секция "Композиция" в глава "Принципи на обектно-ориентираното програмиране").







Сподели с приятели:
1   ...   68   69   70   71   72   73   74   75   ...   84




©obuch.info 2024
отнасят до администрацията

    Начална страница