Отправляет email-рассылки с помощью сервиса Sendsay

Финансы. Инструкция

  Все выпуски  

Уроки по C# и .NET.


Информационный Канал Subscribe.Ru


C# и .NET. Уроки с сайта http://progs.biz

Рассылка №5

Основы C#. Урок 12. Наследование.
Основы C#. Урок 13. Запись в экземпляр базового класса экземпляра производного.

Полные версии уроков (с картинками) можно найти по адресам
Урок 12. Наследование.
Урок 13. Запись в экземпляр базового класса экземпляра производного.

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

Наверх

Основы C#. Урок 13. Запись в экземпляр базового класса экземпляра производного

В переменной типа базового класса можно хранить и переменные производных класов. Например, текст метода Main из класса Test прошлого урока можно переписать следующим образом:

        ...
        static void Main(string[] args)
        {
            Worker wrk1 = new Boss();
            ...

Здесь мы объявили переменную wrk1 типа Worker. Вот другой пример на эту же тему:

        Worker wrk1;
        Boss boss = new Boss();
        wrk1=boss;
        ...

Здесь мы опять записываем в переменную wrk1 (типа Worker) переменную boss (типа Boss).

Но, несмотря на то, что мы записываем в переменную wrk1 или с помощью оператора new или посредством присваивания экземпляр производного класса, все равно методы производного класса мы использовать не можем (на самом деле из производного класса мы не сможем использовать не только методы, но и переменные)!

Например, в следущие строки выведут на экран 50, а не ноль:

    wrk1.setAge(50); //Вызывается метод класса Worker, а не класса Boss
    Console.WriteLine("Возраст работника " + wrk1.getAge());

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

Наверх

Copyright Алексеев Игорь, 2002

Copyright сайт progs.biz, 2002


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное