Основы C#. Урок 12. Наследование
Представьте себе, что у нас есть некоторый класс (быть
может весьма большой), который почти подходит для нашей
конкретной задачи. Почти, но не совсем. Что-то (некоторые
методы) в этом классе надо изменить, что-то - добавить.
Наследование как раз и служит для этого. При наследовании мы
объявляем наш класс потомком другого класса. И наш
класс-потомок (или, как его еще называют, дочерний класс)
автоматически приобретает всё, что было в родительском классе.
Это мы делаем буквально парой строчек. Затем в дочерний класс
мы можем что-нибудь добавить (чего не было в классе
родительском). Кроме того, в дочернем классе мы можем
что-нибудь из родительского класса переопределить - так что
оно уже будет работать по-другому.
Давайте рассмотрим это все на примере. У нас будет класс
Worker и производный от него класс Boss. Класс Boss будет
отличаться от класса Worker во-первых, наличием переменной
numOfWorkers (для количества подчиненных) и, во вторых, метод
для задания возраста (setAge) будет работать в Boss не
так: using System;
namespace test
{
//Класс 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{
public int numOfWorkers; //Количество подчиненных
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. |