Инкапсуляция определяется как процесс включения одного или нескольких элементов в физический или логический пакет. Инкапсуляция в методологии объектно-ориентированного программирования препятствует доступу к деталям реализации.
Абстракция и инкапсуляция связаны с объектно-ориентированным программированием. Абстракция позволяет сделать соответствующую информацию видимой, а инкапсуляция позволяет программисту реализовать желаемый уровень абстракции .
Инкапсуляция реализуется с использованием спецификаторов доступа . Спецификатор доступа определяет область видимости члена класса. 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
В предыдущем примере длина и ширина переменных-членов объявляются общедоступными , поэтому к ним можно получить доступ из функции Main (), используя экземпляр класса Rectangle с именем r .
Функция участника Display () и GetArea () также может напрямую обращаться к этим переменным без использования какого-либо экземпляра класса.
Функции-члены Display () также объявляются общедоступными , поэтому к нему также можно получить доступ из Main (), используя экземпляр класса Rectangle с именем r .
Спецификатор частного доступа
Спецификатор частного доступа позволяет классу скрыть свои переменные-члены и функции-члены от других функций и объектов. Только функции одного класса могут обращаться к своим частным членам. Даже экземпляр класса не может получить доступ к своим частным членам.
Следующий пример иллюстрирует это:
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
В предыдущем примере длина и ширина переменных-членов объявляются частными , поэтому к ним нельзя получить доступ из функции Main (). Функции-члены AcceptDetails () и Display () могут обращаться к этим переменным. Поскольку функции-члены AcceptDetails () и Display ()объявлены общедоступными , к ним можно получить доступ из 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 ()не объявлена с помощью любого спецификатора доступа. Тогда какой будет спецификатор доступа по умолчанию для члена класса, если мы не будем упоминать о нем?
Защищенный спецификатор внутреннего доступа
Защищенный спецификатор внутреннего доступа позволяет классу скрыть свои переменные-члены и функции-члены из других объектов и функций класса, кроме дочернего класса в одном приложении. Это также используется при реализации наследования.
0 комментариев