Membatasi Accessor Accessibility

Get dan set bagian dari properti atau indexer disebut sebagai accessor. Secara default, accessors ini memiliki visibilitas, atau tingkat akses yang sama: properti atau indexer yang menjadi hak mereka. Namun, terkadang berguna untuk membatasi akses ke salah satu aksesor ini. Biasanya, ini melibatkan pembatasan aksesibilitas accessor yang diset, sekaligus menjaga agar accessor tidak dapat diakses publik. Sebagai contoh:
private string name = "Hello";

public string Name
{
    get
    {
        return name;
    }
    protected set
    {
        name = value;
    }
}
Dalam contoh ini, sebuah properti bernama Name mendefinisikan get dan set accessor. Mendapat accessor menerima tingkat aksesibilitas dari properti itu sendiri, public dalam hal ini, sementara accessor yang ditetapkan secara eksplisit dibatasi dengan menerapkan modifier akses protected ke accessor itu sendiri.
Pembatasan pada Access Modifiers pada Accessors
Menggunakan modifier accessor pada properti atau indexer subject pada kondisi berikut:
1. Kita tidak dapat menggunakan modifier accessor pada interface atau implementasi member interface eksplisit.
2. Kita dapat menggunakan modifier accessor hanya jika properti atau indexer memiliki keduanya dan mendapatkan aksesor. Dalam kasus ini,modifier diperbolehkan hanya satu dari dua pengakses.
3. Jika properti atau indexer memiliki modifier override, modifier aksesor harus sesuai dengan accessor dari accessor yang diganti, jika ada.
4. Tingkat aksesibilitas pada accessor harus lebih ketat daripada tingkat aksesibilitas pada properti atau indexer itu sendiri.
Access Modifiers pada Overriding Accessors
Saat kita override properti atau indexer, pengakses yang override harus dapat diakses ke override code. Juga, tingkat aksesibilitas dari kedua properti / indexer, dan para pengakses harus sesuai dengan properti / indexer yang aksesor dan pengaksesnya. Sebagai contoh:
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; }
    }
}

Implementasi Interfaces
Bila kita menggunakan accessor untuk mengimplementasikan interface, accessor mungkin tidak memiliki modifier akses. Namun, jika ktia menerapkan interface menggunakan satu accessor, seperti get, accessor lainnya dapat memiliki indexer akses, seperti pada 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 { }
    }
}
Accessor Accessibility Domain
Jika kita menggunakan modifier akses pada accessor, domain aksesibilitas dari accessor ditentukan oleh modifier ini. Jika kita tidak menggunakan modifier akses pada accessor, domain aksesibilitas dari accessor ditentukan oleh tingkat aksesibilitas properti atau indexer.
Contoh
Contoh berikut berisi tiga class, BaseClass, DerivedClass, dan MainClass. Ada dua properti di BaseClass, Name dan Id pada kedua class. Contoh tersebut menunjukkan bagaimana Id properti pada DerivedClass dapat disembunyikan oleh id properti di BaseClass saat kita menggunakan modifier akses terbatas seperti protected atau private. Oleh karena itu, ketika kita menetapkan nilai ke properti ini, properti di class BaseClass disebut sebagai instead. Mengganti modifier akses oleh public akan membuat properti dapat diakses. Contoh ini juga menunjukkan bahwa modifier akses terbatas, seperti private atau protected, pada set accessor properti Name di DerivedClass mencegah akses ke accessor dan menghasilkan error saat kita menetapkannya.
Previous
Next Post »