ООП. Абстракция

      Комментарии к записи ООП. Абстракция отключены

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

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

    Абстракция представляет собой модель будущего типа данных без конкретной реализации его функционала в виде алгоритмов. Определение типов через абстракцию способствует универсальности и расширяемости кода.

    В абстракцию вынесены все основные характеристики планируемых типов. Но каждому типу, который будет построен по модели абстракции, нужно будет самостоятельно определять логику в каждом её методе.
    Другими словами Абстракция – это контракт, на который подписываются типы данных, если они её реализуют.
    Предположим, наше приложение выполняет логирование процесса некоторых вычислений. В некоторых случаях нам нужно выполнять логирование в базу данных SQL, а иногда – просто в XML файл, или даже просто в текстовый файл. Способов логирования множество, и пытаться предусмотреть все варианты на все случаи жизни, определяя их сразу внутри основного класса как перегруженные методы логирования – плохая идея.

    Есть смысл определить отдельный тип данных, который будет отвечать именно за эту функциональность. А чтобы каждый раз алгоритм был реализован по-разному, на каждый конкретный случай у нас будет по необходимости создаваться отдельный класс со своим алгоритмом логирования. И все конкретные классы будут реализовывать одинаковый базовый интерфейс – ILog

    interface ILog
    {
          void LogData(double num);
    }
     
    //конкретная реализация
    class DBLogger : ILog
    {
         public void LogData(double num)
        {
           //Logging to database
          //...
        }
    }
     
    //класс, выполняющий вычисления
    class Calculator
    {
        ILog log;
      public Calculator(ILog log)
       {
         //установка конкретного типа логирования
          this.log = log;
       }
       public void Total(params double[] arr)
       {
         double result = 0;
         //вычисления
         //...
     
         //выполнение логирования
         log.LogData(result); 
       }
    }

    В данном примере интерфейс ILog является Абстракцией. Класс BDLogger — его конкретной реализацией, определяющей, как именно происходит запись в базу данных Sql.

    Конструктор класса Calculator позволяет установить, каким логгером мы будем пользоваться в данном экземпляре класса. За счёт того что конструктор класса Calculator принимает в качестве параметра ссылку на интерфейс ILog (абстракцию), мы можем передать туда экземпляр любого конкретного класса, реализующего данный интерфейс.
    Тестируем:

    class Program
    {
       static void Main()
       {
         DBLogger logger = new DBLogger();
         Calculator calc = new Calculator(logger);
         calc.Total();
       }
    }

    Если в дальнейшем понадобится другой способ логирования, например, в XML файл, мы напишем класс – наследник ILog, в котором в методе LogData() будет инкапсулирован алгоритм записи именно в файл формата XML. Аналогично мы будем поступать в других случаях.

    То есть построение класса по заранее определённой модели и есть смысл Абстракции.

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