Bagikan melalui


disegel (Referensi C#)

Saat diterapkan ke kelas, pengubah sealed mencegah kelas lain mewarisinya. Dalam contoh berikut, kelas B mewarisi dari kelas A, tetapi tidak ada kelas yang dapat mewarisi dari kelas B.

class A {}
sealed class B : A {}

Anda juga dapat menggunakan pengubah sealed pada metode atau properti yang mengambil alih metode atau properti virtual di kelas dasar. Ini memungkinkan Anda mengizinkan kelas untuk berasal dari kelas Anda dan mencegahnya mengambil alih metode atau properti virtual tertentu.

Contoh

Dalam contoh berikut, Z mewarisi dari Y tetapi Z tidak dapat mengambil alih fungsi virtual F yang dideklarasikan dalam X dan disegel dalam Y.

class X
{
    protected virtual void F() { Console.WriteLine("X.F"); }
    protected virtual void F2() { Console.WriteLine("X.F2"); }
}

class Y : X
{
    sealed protected override void F() { Console.WriteLine("Y.F"); }
    protected override void F2() { Console.WriteLine("Y.F2"); }
}

class Z : Y
{
    // Attempting to override F causes compiler error CS0239.
    // protected override void F() { Console.WriteLine("Z.F"); }

    // Overriding F2 is allowed.
    protected override void F2() { Console.WriteLine("Z.F2"); }
}

Ketika Anda menentukan metode atau properti baru di kelas, Anda dapat mencegah mengambil alih kelas dengan tidak mendeklarasikannya sebagai virtual . Saat Anda mengganti anggota virtual yang dinyatakan dalam tipe dasar, Anda dapat mencegah tipe turunan untuk menggantinya dengan menggunakan kata kunci sealed seperti dalam contoh berikut:

public sealed override string ToString() => Value;

Ini adalah kesalahan untuk menggunakan pengubah abstrak dengan kelas tertutup, karena kelas abstrak harus diwariskan oleh kelas yang menyediakan implementasi metode atau properti abstrak.

Ketika diterapkan ke metode atau properti, pengubah sealed harus selalu digunakan dengan mengambil alih.

Karena struktur disegel secara implisit, mereka tidak dapat diwariskan.

Untuk informasi selengkapnya, lihat Warisan.

Untuk contoh selengkapnya, lihat Kelas Abstrak dan Tersegel dan Anggota Kelas.

sealed class SealedClass
{
    public int x;
    public int y;
}

class SealedTest2
{
    static void Main()
    {
        var sc = new SealedClass();
        sc.x = 110;
        sc.y = 150;
        Console.WriteLine($"x = {sc.x}, y = {sc.y}");
    }
}
// Output: x = 110, y = 150

Dalam contoh sebelumnya, Anda mungkin mencoba mewarisi dari kelas yang disegel dengan menggunakan pernyataan berikut:

class MyDerivedC: SealedClass {} // Error

Hasilnya adalah pesan kesalahan:

'MyDerivedC': cannot derive from sealed type 'SealedClass'

Komentar

Untuk menentukan apakah akan menyegel kelas, metode, atau properti, Anda umumnya harus mempertimbangkan dua poin berikut:

  • Manfaat potensial yang mungkin diperoleh kelas melalui kemampuan untuk menyesuaikan kelas Anda.

  • Potensi bahwa kelas turunan dapat memodifikasi kelas Anda sedemikian rupa sehingga kelas-kelas tersebut tidak lagi berfungsi dengan benar atau seperti yang diharapkan.

Spesifikasi bahasa C#

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

Lihat juga