Bagikan melalui


protected internal (Referensi C#)

Kombinasi kata kunci protected internal adalah pengubah akses anggota. Anggota protected internal dapat diakses dari rakitan saat ini atau dari jenis yang berasal dari kelas yang memuatnya. Untuk perbandingan protected internal dengan pengubah akses lainnya, lihat Tingkat Aksesibilitas.

Contoh

Anggota protected internal dari kelas dasar dapat diakses dari jenis apa pun dalam rakitan yang memuatnya. Ini juga dapat diakses di kelas turunan yang terletak dalam rakitan lain hanya jika akses terjadi melalui variabel jenis kelas turunan. Misalnya, pertimbangkan segmen kode berikut:

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
   protected internal int myValue = 0;
}

class TestAccess
{
    void Access()
    {
        var baseObject = new BaseClass();
        baseObject.myValue = 5;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass : BaseClass
{
    static void Main()
    {
        var baseObject = new BaseClass();
        var derivedObject = new DerivedClass();

        // Error CS1540, because myValue can only be accessed by
        // classes derived from BaseClass.
        // baseObject.myValue = 10;

        // OK, because this class derives from BaseClass.
        derivedObject.myValue = 10;
    }
}

Contoh ini berisi dua file, Assembly1.cs dan Assembly2.cs. File pertama berisi kelas dasar publik, BaseClass, dan kelas lain, TestAccess. BaseClassmemiliki anggota protected internal, myValue, yang diakses oleh jenis TestAccess. Dalam file kedua, upaya untuk mengakses myValue melalui instans BaseClass akan menghasilkan kesalahan, sementara akses ke anggota ini melalui instans kelas turunan, DerivedClass akan berhasil.

Anggota struct tidak boleh protected internal karena struct tidak dapat diwarisi.

Mengambil alih anggota internal yang dilindungi

Saat mengambil alih anggota virtual, pengubah aksesibilitas metode yang ditimpa tergantung pada rakitan tempat kelas turunan ditentukan.

Ketika kelas turunan didefinisikan dalam rakitan yang sama dengan kelas dasar, semua anggota yang ditimpa memiliki protected internal akses. Jika kelas turunan didefinisikan dalam rakitan yang berbeda dari kelas dasar, anggota yang ditimpa memiliki protected akses.

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
    protected internal virtual int GetExampleValue()
    {
        return 5;
    }
}

public class DerivedClassSameAssembly : BaseClass
{
    // Override to return a different example value, accessibility modifiers remain the same.
    protected internal override int GetExampleValue()
    {
        return 9;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClassDifferentAssembly : BaseClass
{
    // Override to return a different example value, since this override
    // method is defined in another assembly, the accessibility modifiers
    // are only protected, instead of protected internal.
    protected override int GetExampleValue()
    {
        return 2;
    }
}

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.

Lihat juga