Инкапсуляция определяется "как процесс включающий один или более элементов в физических или логических пакетах". Инкапсуляция, в методологии объектно-ориентированного программирования, предотвращает доступ к детали реализации.
Абстрагирование и инкапсуляция являются связанными функциями в объектно-ориентированном программировании. Абстрагирование позволяет делать необходимую информацию видимой и инкапсуляция позволяет программисту реализовывать требуемый уровень абстракции.
Инкапсуляция реализуется с использованием спецификаторов доступа. Спецификаторы доступа определяет сферу и видимость членов класса. C# поддерживает следующие спецификаторы доступа:
Спецификатор доступа public позволяет классу открыть его переменные и методы для других методов и объектов. Любой член public может быть доступен вне класса.
Следующий пример это иллюстрирует:
using System;
namespace RectangleApplication
{
class Rectangle
{
//переменные классса
public double length;
public double width;
public double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Длина: {0}", length);
Console.WriteLine("Ширина: {0}", width);
Console.WriteLine("Площадь: {0}", GetArea());
}
}//конец класса Rectangle
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.length = 4.5;
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
Длина: 4.5
Ширина: 3.5
Площадь: 15.75
В данном примере, переменные класса length и width определены как public, таким образом, они могут быть доступны из метода Main() используя экземпляр класса Rectangle, названный r.
Методы класса Display() и GetArea() также могут использовать эти переменные напрямую, без использования экземпляра класса.
Методы класса Display() также определены как public, таким образом, они также доступны из метода Main() используя экземпляр класса Rectangle, названный r.
Спецификатор доступа private позволяет классу скрывать свои переменные и методы от других методов и объектов. Только методы того же класса могут получить доступ к их членам private. Даже экземпляр класса не может получить доступ к членам private.
Следующий пример это иллюстрирует:
using System;
namespace RectangleApplication
{
class Rectangle
{
//переменные классса
private double length;
private double width;
public void Acceptdetails()
{
Console.WriteLine("Введите Длину: ");
length = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Введите Ширину: ");
width = Convert.ToDouble(Console.ReadLine());
}
public double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Длина: {0}", length);
Console.WriteLine("Ширина: {0}", width);
Console.WriteLine("Площадь: {0}", GetArea());
}
}//конец класса Rectangle
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.Acceptdetails();
r.Display();
Console.ReadLine();
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
Введите Длину:
4.4
Введите Ширину:
3.3
Длина: 4.4
Ширина: 3.3
Площадь: 14.52
В данном примере, переменные класса length и width определены как private, таким образом, они не могут быть доступны из метода Main(). Методы класса AcceptDetails() и Display() могут получить доступ к этим переменным. Поскольку методы класса AcceptDetails() и Display() определены как public, доступны из метода Main() используя экземпляр класса Rectangle, названный r.
Спецификатор доступа protected позволяет наследуемому классу получить доступ к переменным и методам базового класса. Таким образом, он помогает в реализации наследования.
Спецификатор доступа internal позволяет классу открывать свои переменные и методы другим методам и объектам expose its member variables and member functions to other functions and objects в текущей сборке. Другими словами, любой член со спецификатором доступа internal может быть доступен из любого другого класса или метода определенного в том же приложении.
Следующий пример это иллюстрирует:
using System;
namespace RectangleApplication
{
class Rectangle
{
//переменные классса
internal double length;
internal double width;
double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Длина: {0}", length);
Console.WriteLine("Ширина: {0}", width);
Console.WriteLine("Площадь: {0}", GetArea());
}
}//конец класса Rectangle
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.length = 4.5;
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
Длина: 4.5
Ширина: 3.5
Площадь: 15.75
В данном примере, обратите внимание, что у метода класса GetArea() не определен спецификатор доступа. Тогда будет поределен спецификатор доступа по умолчанию для члена класса, которым является спецификатор доступа private.
Спецификатор доступа protected internal позволяет классу скрывать переменные и методы класса от других объектов и методов класса, за исключением наследуемых классов в том же приложении. Это также используется при реализации наследования.