Инкапсуляция (инкапсуляция вариаций) – техника сокрытия частей объектно-ориентированных программных систем.
Рассмотрим это на примере:
Вам нужно написать класс описывающий документ. У каждого документа есть заголовок, тело и нижний колонтитул.
Мы можем реализовать данную задачу вот таким способом:
класс описывающий заголовок документа
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();
}
}
Многим покажется неудобная такая форма работы с классом 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();
}
}