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 dan get. 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