Урок 1. Инкапсуляция (вариаций)

Инкапсуляция (инкапсуляция вариаций) – техника сокрытия частей объектно-ориентированных программных систем.

Рассмотрим это на примере:

Вам нужно написать класс описывающий документ. У каждого документа есть заголовок, тело и нижний колонтитул.

Мы можем реализовать данную задачу вот таким способом:

класс описывающий заголовок документа
class Title
{
     string content;

     public string Content
     {
          private get
          {
               if (content != null)
                    return content;
               else
                    return "Заголовок отсутствует.";
          }

          set
          {
               content = value; 
          }
     }

     public void Show()
     {
          Console.ForegroundColor = ConsoleColor.Yellow;
          Console.WriteLine(Content);
          Console.ForegroundColor = ConsoleColor.Gray;
     }
}
класс описывающий тело документа
class Body
{
     string content;

     public string Content
     {
          private get
          {
               if (content != null)
                    return content;
               else
                    return "Тело документа отсутствует.";
          }

          set
          {
               content = value;
          }
     }

     public void Show()
     {
          Console.ForegroundColor = ConsoleColor.Blue;
          Console.WriteLine(Content);
          Console.ForegroundColor = ConsoleColor.Gray;
     }
}
класс описывающий нижний колонтитул документа документа
class Footer
{
     string content;

     public string Content
     {
          private get
          {
               if (content != null)
                    return content;
               else
                    return "Нижний колонтитул отсутствует.";
          }

          set
          {
               content = value;
          }
    }

     public void Show()
     {
          Console.ForegroundColor = ConsoleColor.Green;
          Console.WriteLine(Content);
          Console.ForegroundColor = ConsoleColor.Gray;
     }
}
класс описывающий сам документ
class Document
{
     // Поля
     Title title;
     Body body;
     Footer footer;

     public Document(Title title, Body body, Footer footer)
     {
          this.title = title;
          this.body = body;
          this.footer = footer;
     }

     publicvoid Show()
     {
          this.title.Show();
          this.body.Show();
          this.footer.Show();
     }
}

В таком случае для создания документа пользователю придётся самому сперва создавать все части документа, а после передать их в конструктор класса Document при создании его экземпляра:

class Program
{
     static void Main()
     {
          Title title = new Title();
          title.Content = "Контракт";

          Body body = new Body();
          body.Content = "Тело контракта...";

          Footer footer = new Footer();
          footer.Content = "Директор: ИвановИ.И.";

          Document document = new Document(title, body, footer);
          document.Show();

          // Delay.
          Console.ReadKey();
     }
}

10-11

Многим покажется неудобная такая форма работы с классом Document, поэтому многие придут к выводу, что класс Document лучше реализовать следующим образом:

class Document
{
     // Поля
     Title title = null;
     Body body = null;
     Footer footer = null;

     void InitializeDocument()
     {
          this.title = new Title();
          this.body = new Body();
          this.footer = new Footer();
     }

     public Document(string title)
     {
          InitializeDocument();
          this.title.Content = title;            
     }

     public void Show()
     {
          this.title.Show();
          this.body.Show();
          this.footer.Show();
     }

     public string Body
     {
          set
          {
               body.Content = value;
          }
     }

     public string Footer
     {
          set
          {
               this.footer.Content = value;
          }
      }
} 

В таком случае мы будем работать с экземплярами классов Title, Body и Footer как с частью самого документа (Document) – мы скрыли (инкапсулировали) их от пользователя, и теперь пользователю не нужно знать о них.

Пример использования такого Document:

class Program
{
     static void Main()
     {           
          Document document = newDocument("Контракт");
          document.Body = "Тело контракта...";
          document.Footer = "Директор: Иванов И.И.";

          document.Show();

          // Delay.
          Console.ReadKey();
     }
}

10-11