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


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



страница25/84
Дата03.01.2022
Размер0.54 Mb.
#112941
ТипПрограма
1   ...   21   22   23   24   25   26   27   28   ...   84
Класове
Свързани:
Изпитна тема1, Изпитна тема2
Област на действие на параметрите на конструктора

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

Много често, когато декларираме конструктор с параметри, е възможно да именуваме променливите от списъка му с параметри, със същите имена, като имената на полетата, които ще бъдат инициализирани. Нека за при­мер вземем отново конструктора, който декларирахме в предходната секция:

public Dog(string name, int age, double length)

{

name = name;



age = age;

length = length;

collar = new Collar();

}


Нека компилираме и изпълним съответно Main() метода, който също из­пол­звахме в предходната секция. Ето какъв е резултатът от изпълне­ние­то му:

My dog is 0 year(s) old. It has length: 0 m

Странен резултат, нали? Всъщност се оказва, че не е толкова странен. Обяснението е следното – областта, в която действат про­мен­ливите от списъка с параметри на конструктора, припокрива областта на действие на полетата, които имат същите имена в конструктора. По този на­чин не даваме никаква стойност на полетата, тъй като на практика ние не ги достъпваме. Например, вместо на полето age, ние присвояваме стойността на променливата age на самата нея:

age = age;

Както видяхме в секцията "Припокриване на полета с локални промен­ливи", за да избегнем това разминаване, трябва да достъ­пим полето, на което искаме да присвоим стойност, но чието име съвпада с името на променлива от списъка с параметри, използвайки ключовата дума this:

public Dog(string name, int age, double length)

{

this.name = name;



this.age = age;

this.length = length;

this.collar = new Collar();

}


Сега, ако изпълним отново Main() метода:

public static void Main()

{

Dog myDog = new Dog("Bobi", 2, 0.4);



 

Console.WriteLine("My dog " + myDog.name +

" is " + myDog.age + " year(s) old. " +

" and it has length: " + myDog.length + " m");

}


Резултатът ще бъде точно какъвто очакваме да бъде:

My dog Bobi is 2 year(s) old. It has length: 0.4 m

Конструктор с променлив брой аргументи

Подобно на методите с променлив брой аргументи, които разгледахме в главата "Методи", конструкторите също могат да бъдат декла­ри­ра­ни с параметър за променлив брой аргументи. Правилата за деклара­ция и извикване на конструктори с променлив брой аргументи са същите като тези, които описахме за декларацията и извикването при методи:

-     Когато декларираме конструктор с променлив брой параметри, тряб­ва да използваме запазената дума params, след което поставяме типа на параметрите, следван от квадратни скоби. Накрая, следва името на масива, в който ще се съхраняват подадените при извикване на метода аргументи. Например за целочислени аргу­менти ползваме params int[] numbers.

-     Позволено е, конструкторът с променлив брой параметри да има и други параметри в списъка си от параметри.

-     Параметърът за променлив брой аргументи трябва да е последен в списъка от параметри на конструктора.

Нека разгледаме примерна декларация на конструктор на клас, който описва лекция:



public Lecture(string subject, params string[] studentsNames)

{

// ... Initialization of the instance variables ...



}

Първият параметър в декларацията е името на предмета, по който е лек­цията, а следващия параметър е за променлив брой аргументи – имената на студентите. Ето как би изглеждало примерното създаване на обект от този клас:

Lecture lecture =

new Lecture("Biology", "Pencho", "Mincho", "Stancho");



Съответно, като първи параметър сме подали името на предмета – "Biology", а за всички оставащи аргументи – имената на присъстващите студенти.

Варианти на конструкторите (overloading)

Както видяхме, можем да декларираме конструктори с параметри. Това ни дава възможност да декларираме конструктори с различна сигнатура (брой и подредба на параметрите), с цел да предоставим удобство на тези, които ще създават обекти от нашия клас. Създа­ва­нето на конструк­тори с различна сигнатура се нарича създаване на варианти на кон­структорите (constructors overloading).

Нека вземем за пример класа Dog. Можем да декларираме различни кон­струк­тори:



// No parameters

public Dog()

{

this.name = "Sharo";



this.age = 1;

this.length = 0.3;

this.collar = new Collar();

}

 



// One parameter

public Dog(string name)

{

this.name = name;



this.age = 1;

this.length = 0.3;

this.collar = new Collar();

}

 



// Two parameters

public Dog(string name, int age)

{

this.name = name;



this.age = age;

this.length = 0.3;

this.collar = new Collar();

}

 



// Three parameters

public Dog(string name, int age, double length)

{

this.name = name;



this.age = age;

this.length = length;

this.collar = new Collar();

}

 



// Four parameters

public Dog(string name, int age, double length, Collar collar)

{

this.name = name;



this.age = age;

this.length = length;

this.collar = collar;

}




Сподели с приятели:
1   ...   21   22   23   24   25   26   27   28   ...   84




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

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