С# — инкапсуляция
Инкапсуляция определяется как «процесс включения одного или нескольких элементов в физический или логический пакет». Инкапсуляция в методологии объектно-ориентированного программирования предотвращает доступ к деталям реализации.
Абстракция и инкапсуляция — связанные функции объектно-ориентированного программирования. Абстракция позволяет сделать релевантную информацию видимой, а инкапсуляция позволяет программисту реализовать желаемый уровень абстракции .
Инкапсуляция реализуется с помощью спецификаторов доступа. . Описатель доступа определяет область действия и видимость члена класса. C# поддерживает следующие спецификаторы доступа —
- Общедоступно
- Личное
- Защищено
- Внутренний
- Защищено внутреннее
Спецификатор общего доступа
Спецификатор открытого доступа позволяет классу предоставлять свои переменные-члены и функции-члены другим функциям и объектам. К любому открытому члену можно получить доступ извне класса.
Следующий пример иллюстрирует это —
Живая демонстрация
using System;
namespace RectangleApplication {
class Rectangle {
//member variables
public double length;
public double width;
public double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.length = 4.5;
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}
Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —
Length: 4.5 Width: 3.5 Area: 15.75
В предыдущем примере переменные-члены length и width объявлены public. , поэтому к ним можно получить доступ из функции Main() с помощью экземпляра класса Rectangle с именем r .
Функция-член Display() и ПолучитьОбласть() также может обращаться к этим переменным напрямую, без использования какого-либо экземпляра класса.
Функции-члены Display() также объявляется общедоступным , поэтому к нему также можно получить доступ из Main() используя экземпляр класса Rectangle с именем r .
Спецификатор частного доступа
Спецификатор доступа Private позволяет классу скрыть свои переменные-члены и функции-члены от других функций и объектов. Только функции одного класса могут получить доступ к его закрытым членам. Даже экземпляр класса не может получить доступ к своим закрытым членам.
Следующий пример иллюстрирует это —
Живая демонстрация
using System;
namespace RectangleApplication {
class Rectangle {
//member variables
private double length;
private double width;
public void Acceptdetails() {
Console.WriteLine("Enter Length: ");
length = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter Width: ");
width = Convert.ToDouble(Console.ReadLine());
}
public double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.Acceptdetails();
r.Display();
Console.ReadLine();
}
}
}
Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —
Enter Length: 4.4 Enter Width: 3.3 Length: 4.4 Width: 3.3 Area: 14.52
В предыдущем примере переменные-члены length и width объявлены private. , поэтому к ним нельзя получить доступ из функции Main(). Функции-члены AcceptDetails() и Показать() может получить доступ к этим переменным. Поскольку функции-члены AcceptDetails() и Показать() объявляются общедоступными , к ним можно получить доступ из Main() используя экземпляр класса Rectangle с именем r .
Спецификатор защищенного доступа
Спецификатор защищенного доступа позволяет дочернему классу получать доступ к переменным-членам и функциям-членам своего базового класса. Таким образом, это помогает в реализации наследования. Мы обсудим это более подробно в главе о наследовании.
Внутренний спецификатор доступа
Внутренний спецификатор доступа позволяет классу предоставлять свои переменные-члены и функции-члены другим функциям и объектам в текущей сборке. Другими словами, к любому члену с внутренним спецификатором доступа можно получить доступ из любого класса или метода, определенного в приложении, в котором определен член.
Следующая программа иллюстрирует это —
Живая демонстрация
using System;
namespace RectangleApplication {
class Rectangle {
//member variables
internal double length;
internal double width;
double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.length = 4.5;
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}
Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —
Length: 4.5 Width: 3.5 Area: 15.75
Обратите внимание, что в предыдущем примере функция-член GetArea() не объявляется ни с каким спецификатором доступа. Тогда каким будет спецификатор доступа по умолчанию для члена класса, если мы его не упомянем? Это частное .
Защищенный внутренний спецификатор доступа
Защищенный внутренний спецификатор доступа позволяет классу скрывать свои переменные-члены и функции-члены от других объектов и функций класса, за исключением дочернего класса в том же приложении. Это также используется при реализации наследования.
Язык C