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
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#.