Membatasi Aksesibilitas Pengakses (Panduan Pemrograman C#)
Bagian persiapandari properti atau pengindeks disebut pengakses. Secara default, pengakses ini memiliki visibilitas atau tingkat akses yang sama dengan properti atau pengindeks tempat mereka berada. Untuk informasi selengkapnya, lihat tingkat aksesibilitas. Namun, terkadang berguna untuk membatasi akses ke salah satu aksesor ini. Biasanya, Anda membatasi aksesibilitas set
aksesor, sambil get
menjaga aksesor tetap dapat diakses secara publik. Misalnya:
private string _name = "Hello";
public string Name
{
get
{
return _name;
}
protected set
{
_name = value;
}
}
Dalam contoh ini, properti bernama Name
menegaskan pengakses get
dan set
. Pengakses get
menerima tingkat aksesibilitas dari properti itu sendiri, public
khususnya dalam hal ini, sedangkan pengakses set
secara eksplisit dibatasi dengan menerapkan pengubah akses terlindungi ke pengakses itu sendiri.
Catatan
Contoh dalam artikel ini tidak menggunakan properti yang diimplementasikan secara otomatis. Properti yang diterapkan secara otomatis menyediakan sintaks ringkas untuk mendeklarasikan properti saat bidang pencadangan kustom tidak diperlukan.
Pembatasan Pengubah Akses pada Pengakses
Menggunakan pengubah pengakses pada properti atau pengindeks harus memerhatikan ketentuan berikut:
- Anda tidak dapat menggunakan pengubah aksesor pada antarmuka atau implementasi anggota antarmuka eksplisit.
- Anda dapat menggunakan pengubah pengakses hanya jika properti atau pengindeks memiliki pengakses
set
danget
. Dalam hal ini, pengubah diizinkan hanya pada salah satu dari dua pengakses. - Jika properti atau pengindeks memiliki pengubah yang dominan, pengubah pengakses harus cocok dengan pengakses dari pengakses yang bertumpuk, jika ada.
- Tingkat aksesibilitas pada pengakses harus lebih terbatas daripada tingkat aksesibilitas pada properti atau pengindeks itu sendiri.
Pengubah Akses pada Pengakses yang Bertumpuk
Saat Anda mengganti properti atau pengindeks, pengakses yang ditimpa harus dapat diakses oleh kode yang dominan. Selain itu, aksesibilitas properti/pengindeks dan pengaksesnya harus cocok dengan properti/pengindeks yang diganti dan pengaksesnya. Misalnya:
public class Parent
{
public virtual int TestProperty
{
// Notice the accessor accessibility level.
protected set { }
// No access modifier is used here.
get { return 0; }
}
}
public class Kid : Parent
{
public override int TestProperty
{
// Use the same accessibility level as in the overridden accessor.
protected set { }
// Cannot use access modifier here.
get { return 0; }
}
}
Menerapkan Antarmuka
Saat Anda menggunakan pengakses untuk mengimplementasikan antarmuka, pengakses mungkin tidak memiliki pengubah akses. Namun, jika Anda mengimplementasikan antarmuka menggunakan satu pengakses, seperti get
, pengakses lain dapat memiliki pengubah akses, seperti dalam contoh berikut:
public interface ISomeInterface
{
int TestProperty
{
// No access modifier allowed here
// because this is an interface.
get;
}
}
public class TestClass : ISomeInterface
{
public int TestProperty
{
// Cannot use access modifier here because
// this is an interface implementation.
get { return 10; }
// Interface property does not have set accessor,
// so access modifier is allowed.
protected set { }
}
}
Domain Aksesibilitas Pengakses
Jika Anda menggunakan pengubah akses pada pengakses, domain aksesibilitas pengakses ditentukan oleh pengubah ini.
Jika Anda tidak menggunakan pengubah akses pada aksesor, domain aksesibilitas aksesor ditentukan oleh tingkat aksesibilitas properti atau pengindeks.
Contoh
Contoh berikut berisi tiga kelas, BaseClass
, DerivedClass
, dan MainClass
. Ada dua properti di BaseClass
, Name
dan Id
di kedua kelas. Contoh menunjukkan bagaimana properti Id
di DerivedClass
dapat disembunyikan oleh properti Id
di BaseClass
bila Anda menggunakan pengubah akses terbatas seperti yang dilindungi ataupun yang diatur pribadi. Oleh karena itu, saat Anda menetapkan nilai ke properti ini, properti di kelas BaseClass
akan dipanggil sebagai gantinya. Mengganti pengubah akses dengan publik akan membuat properti dapat diakses.
Contoh ini juga menunjukkan bahwa pengubah akses terbatas, seperti private
atau protected
, pada set
aksesor Name
properti dalam DerivedClass
mencegah akses ke aksesor di kelas turunan. Ini menghasilkan kesalahan saat Anda menetapkannya, atau mengakses properti kelas dasar dengan nama yang sama, jika dapat diakses.
public class BaseClass
{
private string _name = "Name-BaseClass";
private string _id = "ID-BaseClass";
public string Name
{
get { return _name; }
set { }
}
public string Id
{
get { return _id; }
set { }
}
}
public class DerivedClass : BaseClass
{
private string _name = "Name-DerivedClass";
private string _id = "ID-DerivedClass";
new public string Name
{
get
{
return _name;
}
// Using "protected" would make the set accessor not accessible.
set
{
_name = value;
}
}
// Using private on the following property hides it in the Main Class.
// Any assignment to the property will use Id in BaseClass.
new private string Id
{
get
{
return _id;
}
set
{
_id = value;
}
}
}
class MainClass
{
static void Main()
{
BaseClass b1 = new BaseClass();
DerivedClass d1 = new DerivedClass();
b1.Name = "Mary";
d1.Name = "John";
b1.Id = "Mary123";
d1.Id = "John123"; // The BaseClass.Id property is called.
System.Console.WriteLine("Base: {0}, {1}", b1.Name, b1.Id);
System.Console.WriteLine("Derived: {0}, {1}", d1.Name, d1.Id);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/* Output:
Base: Name-BaseClass, ID-BaseClass
Derived: John, ID-BaseClass
*/
Komentar
Perhatikan bahwa jika Anda mengganti deklarasi new private string Id
dengan new public string Id
, Anda akan mendapatkan output:
Name and ID in the base class: Name-BaseClass, ID-BaseClass
Name and ID in the derived class: John, John123
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk