Основы 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.
|