Учебники

C # — Инкапсуляция

Инкапсуляция определяется как «процесс включения одного или нескольких элементов в физический или логический пакет». Инкапсуляция в методологии объектно-ориентированного программирования предотвращает доступ к деталям реализации.

Абстракция и инкапсуляция являются связанными функциями в объектно-ориентированном программировании. Абстракция позволяет сделать релевантную информацию видимой, а инкапсуляция позволяет программисту реализовать желаемый уровень абстракции .

Инкапсуляция осуществляется с помощью спецификаторов доступа . Спецификатор доступа определяет область действия и видимость члена класса. C # поддерживает следующие спецификаторы доступа —

  • общественного
  • Частный
  • защищенный
  • внутренний
  • Защищенный внутренний

Спецификатор публичного доступа

Спецификатор открытого доступа позволяет классу предоставлять свои переменные-члены и функции-члены другим функциям и объектам. Любой общедоступный член может быть доступен извне класса.

Следующий пример иллюстрирует это —

Live Demo

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 .

Спецификатор частного доступа

Спецификатор закрытого доступа позволяет классу скрывать свои переменные-члены и функции-члены от других функций и объектов. Только функции одного класса могут получить доступ к своим закрытым членам. Даже экземпляр класса не может получить доступ к своим закрытым членам.

Следующий пример иллюстрирует это —

Live Demo

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 .

Спецификатор защищенного доступа

Спецификатор защищенного доступа позволяет дочернему классу обращаться к переменным-членам и функциям-членам своего базового класса. Таким образом, это помогает в реализации наследования. Мы обсудим это более подробно в главе о наследовании.

Спецификатор внутреннего доступа

Внутренний спецификатор доступа позволяет классу предоставлять свои переменные-члены и функции-члены другим функциям и объектам в текущей сборке. Другими словами, любой член с внутренним спецификатором доступа может быть доступен из любого класса или метода, определенного в приложении, в котором определен член.

Следующая программа иллюстрирует это —

Live Demo

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 () не объявлена ​​с каким-либо спецификатором доступа. Тогда что будет спецификатором доступа по умолчанию для члена класса, если мы не будем упоминать его? Это личное .

Спецификатор защищенного внутреннего доступа

Спецификатор защищенного внутреннего доступа позволяет классу скрывать свои переменные-члены и функции-члены от других объектов и функций класса, кроме дочернего класса в том же приложении. Это также используется при реализации наследования.