Област на действие на параметрите на конструктора
По аналогия на областта на действие на променливите в списъка с параметри на един метод, променливите в списъка с параметри на един конструктор имат област на действие от отварящата скоба на конструктора до затварящата такава, т.е. в цялото тяло на конструктора.
Много често, когато декларираме конструктор с параметри, е възможно да именуваме променливите от списъка му с параметри, със същите имена, като имената на полетата, които ще бъдат инициализирани. Нека за пример вземем отново конструктора, който декларирахме в предходната секция:
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 на самата нея:
Както видяхме в секцията "Припокриване на полета с локални променливи", за да избегнем това разминаване, трябва да достъпим полето, на което искаме да присвоим стойност, но чието име съвпада с името на променлива от списъка с параметри, използвайки ключовата дума 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;
}
|
Сподели с приятели: |