Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы C#.doc
Скачиваний:
58
Добавлен:
10.02.2015
Размер:
430.59 Кб
Скачать

Основы c#. Урок 11. Конструкторы классов

Для начала кратко обсудим, что такое конструктор вообще. Конструктор - это функция (метод) класса. Раз эта функция, то описываем мы ее почти точно так же, как и любую другую функцию класса - пишем параметры в круглых скобках и т. п. Когда конструктор вызывается? В момент создания переменной. При этом у класса может быть несколько конструкторов - но при этом они должны различаться или типом параметров, или их количеством.

Этот урок будет основан на предыдущем. Откройте проект, созданный на прошлом уроке. Давайте добавим в наш класс Worker конструктор:

...

class Worker

{

public int age=3;

public string name;

//Конструктор 1

public Worker(int age, string name)

{

this.age=age;

this.name=name;

}

}

...

Обратите внимание на ряд особенностей конструктора. Во-первых, конструктор называется как класс. Раз наш класс называется Worker, значит и конструктор должен называться точно также. И во-вторых, конструктор, в отличие от других методов класса, не возвращает никакого значения (даже типа void). Если вы знакомы с языком C++, то, несомненно, это вам все знакомо.

Что делает наш конструктор? Он записывает передаваемые в него параметры во внутренние переменные класса. Обратите внимание, что называются они одинаково - age и age, name и name. Компилятор сначала ищет локальную переменную с таким именем, и, если не находит, то переменную класса. Поэтому age (и name) - это передаваемый в конструктор параметр. Если же нам надо сослаться на переменную класса (при существавании переменной с таким же именем, как и передаваемый в функцию параметр), то мы используем ключевое слово this. Оно всегда указывает на текущий экземпляр нашего класса. Таким образом в строчках

...

this.age=age;

this.name=name;

...

мы передаем параметры конструктора в переменые класса.

Теперь изменим тестовый класс test следующим образом:

...

static void Main(string[] args)

{

//Вызываем конструктор

Worker wrk1 = new Worker(40, "Вася");

Console.WriteLine(wrk1.name+", "+wrk1.age);

}

...

Теперь после объявления переменной мы вызываем конструктор с двумя параметрами, который запишет в переменные age и name экземпляра класса Worker значания 40 и "Вася". Строчкой ниже эти значения выводятся на экран.

Основы c#. Урок 12. Наследование

Представьте себе, что у нас есть некоторый класс (быть может весьма большой), который почти подходит для нашей конкретной задачи. Почти, но не совсем. Что-то (некоторые методы) в этом классе надо изменить, что-то - добавить. Наследование как раз и служит для этого. При наследовании мы объявляем наш класс потомком другого класса. И наш класс-потомок (или, как его еще называют, дочерний класс) автоматически приобретает всё, что было в родительском классе. Это мы делаем буквально парой строчек. Затем в дочерний класс мы можем что-нибудь добавить (чего не было в классе родительском). Кроме того, в дочернем классе мы можем что-нибудь из родительского класса переопределить - так что оно уже будет работать по-другому.

Давайте рассмотрим это все на примере. У нас будет класс Worker и производный от него класс Boss. Класс Boss будет отличаться от класса Worker во-первых, наличием переменной numOfWorkers (для количества подчиненных) и, во вторых, метод для задания возраста (setAge) будет работать в Boss не так:

usingSystem;

namespacetest

{

//Класс Worker

class Worker

{

protected int age=0;

public void setAge(int age)

{

if(age>0 && age<100)

this.age=age;

else

this.age=0;

}

public int getAge()

{

return age;

}

}

//Класс Boss

class Boss : Worker{

publicintnumOfWorkers;//Количество подчиненных

public new void setAge(int age)

{

if(age>0 && age<45)

this.age=age;

else

this.age=0;

}

}

class Test

{

static void Main(string[] args)

{

Worker wrk1 = new Worker();

Boss boss = new Boss();

wrk1.setAge(50);

boss.setAge(50);

boss.numOfWorkers=4;

Console.WriteLine("Возраст работника "+wrk1.getAge());

Console.WriteLine("Возраст босса "+boss.getAge()+

".\nКоличество подчиненных "+boss.numOfWorkers);

}

}

}

Обратите внимание, как мы вводим новый класс Boss:

...

class Boss : Worker{

...

Такая запись и означает, что новый класс Boss будет потомком другого класса (Worker в данном случае). Так как наш класс - потомок другого класса, то он автоматически умеет все тоже самое, что и родительский класс. В частности, в нем есть переменная age для хранения возраста. Далее, в класс Boss мы вводим переменную numOfWorkers для хранения количество подчиненных у нашего босса. В родительском классе такой переменной не было. Кроме того, нас не устроила реализация метода setAge из родительского класса Worker (по каким-то там внутренним инструкциям фирмы возраст босса не может превышать 45 лет, тогда как возраст работника не может превышать 100), поэтому мы просто написали в классе Boss метод с таким же именем. Обратите внимание на слово new при объявлении метода:

...

public new void setAge(int age)

...

Таким образом мы в производном классе можем что-нибудь добавлять и что-нибудь изменять по отношению к классу родительскому. Обратите внимание, что убирать что-нибудь, полученное в наследство от родительского класса, мы не можем.

При запуске наша программа даст вполне ожидаемый результат - в возраст работника запишется 50, в возраст босса - 0.