C# – Encapsulation
Encapsulation atau “enkapsulasi” dapat diartikan sebagai proses menyembunyikan satu atau lebih elemen dalam sebuah paket fisik atau logis. Dalam pemrograman berorientasi objek, enkapsulasi mencegah akses ke detail implementasi.
Abstraksi dan enkapsulasi adalah fitur terkait dalam pemrograman berorientasi objek. Abstraksi memungkinkan untuk menampilkan informasi yang relevan, sementara enkapsulasi memungkinkan seorang programmer untuk mengimplementasikan tingkat abstraksi yang diinginkan.
Enkapsulasi diimplementasikan dengan menggunakan access specifier atau “penentu akses.” Access specifier ini mendefinisikan cakupan dan visibilitas dari anggota sebuah class. Di C#, ada beberapa jenis “access specifiers” yang bisa dipake:
- Public − Bisa diakses sama siapa aja.
- Private − Cuma bisa diakses di dalam class itu sendiri
- Protected − Bisa diakses di dalam class itu atau class turunannya.
- Internal − Bisa diakses sama class lain dalam satu assembly.
- Protected internal − Ini gabungan dari yang protected sama internal.
Public Access Specifier
Access specifier public memungkinkan suatu class untuk mengekspos variabel anggota dan fungsi anggota kepada fungsi dan objek lain. Semua anggota public dapat diakses dari luar class.
Berikut ini adalah contoh yang menggambarkan hal tersebut:
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();
}
}
}
Kalo kode di atas di-compile dan dijalankan, hasilnya bakal seperti ini nih:
Length: 4.5
Width: 3.5
Area: 15.75
Pada contoh sebelumnya, variabel anggota length dan width dideklarasikan sebagai public, sehingga mereka dapat diakses dari fungsi Main() menggunakan sebuah instance dari class Rectangle, yang dinamai sebagai r.
Fungsi anggota Display() dan GetArea() juga dapat mengakses variabel-variabel ini secara langsung tanpa menggunakan instance class.
Fungsi anggota Display() juga dideklarasikan sebagai public, sehingga dapat diakses dari Main() menggunakan sebuah instance dari class Rectangle, yang dinamai sebagai r.
Private Access Specifier
access specifier private memungkinkan suatu class untuk menyembunyikan variabel anggota dan fungsi anggotanya dari fungsi dan objek lain. Hanya fungsi-fungsi dalam class yang sama yang dapat mengakses anggota-anggota private tersebut. Bahkan instance dari class tersebut tidak dapat mengakses anggota-anggota private tersebut.
Berikut ini adalah contoh yang menggambarkan hal ini:
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();
}
}
}
Kalo kode di atas di-compile dan dijalankan, hasilnya bakal seperti ini nih:
Enter Length:
4.4
Enter Width:
3.3
Length: 4.4
Width: 3.3
Area: 14.52
Pada contoh sebelumnya, variabel anggota length dan width dideklarasikan sebagai private, sehingga tidak dapat diakses dari fungsi Main(). Fungsi anggota AcceptDetails() dan Display() dapat mengakses variabel-variabel ini. Karena fungsi anggota AcceptDetails() dan Display() dideklarasikan sebagai public, maka mereka dapat diakses dari Main() menggunakan sebuah instance dari class Rectangle, yang dinamai sebagai r.
Protected Access Specifier
Access specifier protected memungkinkan class anak untuk mengakses variabel anggota dan fungsi anggota dari class dasarnya. Ini membantu dalam mengimplementasikan pewarisan (inheritance). Nanti kita akan membahas ini lebih detail dalam bab tentang pewarisan.
Internal Access Specifier
Access specifier internal memungkinkan sebuah class untuk mengekspos variabel anggota dan fungsi anggota ke fungsi-fungsi dan objek-objek lain dalam satu “assembly” (kelompok dari beberapa file dalam proyek). Dengan kata lain, anggota dengan penentu akses internal dapat diakses dari class atau metode mana pun yang didefinisikan dalam aplikasi di mana anggota tersebut didefinisikan.
Berikut adalah contoh program yang menggambarkan hal ini:
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();
}
}
}
Kalo kode di atas di-compile dan dijalankan, hasilnya bakal seperti ini nih:
Length: 4.5
Width: 3.5
Area: 15.75
Pada contoh sebelumnya, perhatikan bahwa fungsi anggota GetArea() tidak dideklarasikan dengan access specifier apa pun. Nah, apa sih access specifier anggota class secara default jika kita tidak menyebutkan apa-apa? Default-nya adalah private.
Protected Internal Access Specifier
Access specifier protected internal memungkinkan sebuah class untuk menyembunyikan variabel anggota dan fungsi anggota dari class dan fungsi lain, kecuali class turunannya dalam aplikasi yang sama. Ini juga digunakan ketika menerapkan pewarisan.
Jadi, dalam kata lain, anggota dengan penentu akses protected internal bisa diakses oleh class turunannya dan juga oleh class lainnya dalam aplikasi yang sama, tetapi tidak bisa diakses oleh class-class di luar aplikasi tersebut.
Dengan menggunakan penentu akses protected internal, kita bisa mengatur agar suatu anggota class hanya dapat diakses oleh beberapa class tertentu yang merupakan turunannya atau berada dalam aplikasi yang sama, sehingga meningkatkan kontrol akses dan keamanan dalam kode kita.