Инкапсуляция определяется как «процесс включения одного или нескольких элементов в физический или логический пакет». Инкапсуляция в методологии объектно-ориентированного программирования предотвращает доступ к деталям реализации.
Абстракция и инкапсуляция являются связанными функциями в объектно-ориентированном программировании. Абстракция позволяет сделать релевантную информацию видимой, а инкапсуляция позволяет программисту реализовать желаемый уровень абстракции .
Инкапсуляция осуществляется с помощью спецификаторов доступа . Спецификатор доступа определяет область действия и видимость члена класса. 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 () не объявлена с каким-либо спецификатором доступа. Тогда что будет спецификатором доступа по умолчанию для члена класса, если мы не будем упоминать его? Это личное .
Спецификатор защищенного внутреннего доступа
Спецификатор защищенного внутреннего доступа позволяет классу скрывать свои переменные-члены и функции-члены от других объектов и функций класса, кроме дочернего класса в том же приложении. Это также используется при реализации наследования.