ООП. Наследование

      Комментарии к записи ООП. Наследование отключены

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 3 нед., 6 дн. назад.

  • Автор
    Сообщения
  • #4025

    Наследование является способом расширения функциональных возможностей существующих типов данных. Например, типов, определённых как часть библиотеки. Есть правило, что менять уже существующее не годится. Переписывать всё заново тоже плохо, потому что частично нужная функциональность уже реализована. Её нужно только дополнить и расширить.

    Например, у нас есть класс Часы (Clock). Он обладает возможностью установки и получения текущего времени. Установка значения времени перегружена, позволяя передавать нужную величину через параметр.

    class Clock
    {
       DateTime current_Time;
       //установка времени(отталкиваясь от текущего)
       public void SetTime()
       {
          current_Time = DateTime.Now;
       }
         //установка времени(поправка)
       public void SetTime(DateTime dt)
       {
         //...
       }
       //получение значения времени (с учётом поправки)
       public DateTime CheckCurrentTime()
      {
         //... 
      }
       //распечатка текущего времени
       public void PrintCurrentTime()
       {
         //...
       }
    }
     
    Тестирование работы наших часов выглядит так:
     
    class Program
    {
        static void Main()
       { 
          Clock clock = new Clock();
          clock.SetTime();
          Console.WriteLine( clock.CheckCurrentTime().ToString("T"));
       }
    }

    Мы создаём экземпляр класса Clock, задаём время и отображаем значение времени у данного экземпляра часов в определённом формате.

    Какое-то время мы пользовались этим классом, и нас всё устраивало. Но вдруг понадобились не просто часы, а будильник, а именно возможность выставить целевое время подачи сигнала, подавать сигнал в установленное время, стартовать и останавливать его работу. Но в остальных же случаях функционала обычных часов будет достаточно.

    Решением будет создание на базе класса Clock класса AlarmClock (Будильник), добавить в него недостающий функционал и использовать в тех случаях, когда нужен именно будильник, а не просто часы.

    Примерно это будет выглядеть вот так:

    class AlarmClock: Clock
    {
       //время сигнала
       DateTime alarmTime;
       bool is_active;
       //установка времени сигнала
       public void SetAlarmTime(DateTime dt)
       {
          //...
          alarmTime = dt;
       }
       //подача сигнала будильника
       void DoAlarm()
       {
         //...
         StopAlarm();
       }
       //начало работы будильника
       public void StartAlarm()
       {
         is_active = true;
         Console.WriteLine("AlarmClock started");
         //...
      }
       //остановка работы будильника
       void StopAlarm()
       {
         //...
         is_active = false;
          Console.WriteLine("AlarmClock stopped");
       }
    }

    Тестируем его работу:

    class Program
    {
       static void Main()
       {
         AlarmClock aclock = new AlarmClock();
         //вызов метода базового класса
         //установка текущего времени
         aclock.SetTime();
         //проверка текущего времени
         Console.WriteLine(aclock.CheckCurrentTime().ToString("T"));
         //вызов метода производного класса
         //установка времени подачи сигнала
         aclock.SetAlarmTime(DateTime.Now.AddMinutes(10));
         //начало работы будильника
         aclock.StartAlarm();
         Console.ReadKey();
       }
    }

    Теперь у нас есть 2 класса. Базовый – Clock и производный от него – AlarmClock. Преимущество наследования в том, что производный тип обладает функционалом и данными своего базового типа, а также своими собственными, и при этом нет дублирования в коде. Мы получили 2 полноценных типа данных, каждый из которых можем использовать в подходящей ситуации.

    Подытожим, сказав, что класс Alarm НАСЛЕДУЕТ часть функциональности от класс Clock.

    По теме наследования рекомендую почитать также статью «Отцы и дети (о правильном наследовании)«.

Для ответа в этой теме необходимо авторизоваться.