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