Nesne yönelimli programlamanın temel felsefelerinden biri de kalıtımdır. Konu ile ilgili detayları şuradan inceleyebilirsiniz. sealed, sınıflara ve üyelere(metot ve property) uygulanabilen bir anahtar sözcüktür. Anlamı; kapalı, mühürlü şeklinde çevirilebilir. Sınıflar için kalıtımı, üyeler için ise override edilmeyi önler. Basit örnekler üzerinden inceleme yapalım.
Birbirinden türetilen A,B ve C sınıfları olsun.
class Program : C
{
static void Main(string[] args)
{
}
}
public class A
{
public string AProperty { get; set; }
}
public class B : A
{
public string BProperty { get; set; }
}
public class C : B
{
public string CProperty { get; set; }
}
Main metodu içerisinde Program tipinden bir nesne örneklediğimizde, Program sınıfının C sınıfından kalıtılması sebebiyle ilgili property’lere erişebildiğimizi görürüz. Zaten kalıtımın temel mantıklarından biri de buydu.
Projeyi yukarıdaki hali ile derlediğimizde herhangi bir hata almayacağız. Şimdi de amacımız, C sınıfından yapılacak bir kalıtımı önlemek. Bunun için C sınıfına sealed anahtar sözcüğünü uygulamamız yeterli olacaktır.
public sealed class C : B
{
public string CProperty { get; set; }
}
sealed ile, C sınıfından herhangi bir kalıtım yapılması halinde derleme zamanı hatası alınmasını sağladık. Son hali ile projemizi derlediğimizde aşağıdaki gibi bir hata mesajı ile karşılaşacağız.
'sealedKeyword.Program': cannot derive from sealed type 'sealedKeyword.C'
Program sınıfının, sealed olarak işaretlenmiş olan C sınıfından kalıtamayacağı mesajı aldık. Dolayısı ile artık C sınıfından kalıtım yapamayacağız.
Şimdi de A sınıfı içerisine virtual bir metot ekleyelim. Daha sonra da B sınıfında bu metodu override edelim.
public class A
{
public virtual void Test()
{
Console.WriteLine("A sınıfındaki Test metodu çalıştı");
}
}
public class B : A
{
public override void Test()
{
Console.WriteLine("B sınıfındaki Test metodu çalıştı");
}
}
Program sınıfını B sınıfından kalıtalım ve Test metodunu override etmeye çalışalım.
Görüldüğü gibi Test metodu da override edilebilir bir metot olarak karşımıza çıktı.
class Program : B
{
public override void Test()
{
Console.WriteLine("Program sınıfındaki Test metodu çalıştı");
}
static void Main(string[] args)
{
}
}
Programı derlediğimizde hata ile karşılaşmayacağız. Şimdi de B sınıfına giderek Test metodumuzu sealed olarak işaretleyelim.
public class A
{
public virtual void Test()
{
Console.WriteLine("A sınıfındaki Test metodu çalıştı");
}
}
public class B : A
{
public sealed override void Test()
{
Console.WriteLine("B sınıfındaki Test metodu çalıştı");
}
}
Tekrar program sınıfına dönelim ve Test metodunu override etmeyi deneyelim.
Artık override edilebilecek üyeler listesinde Test metodunu göremeyeceğiz. Sebebi, sealed ile işaretlenmiş olması, yani artık override edilemeyecek olmasıdır. Derleyiciden yardım almayarak manuel olarak override ettiğimizde ise derleyici tarafından bir hata mesajı alacağız.
class Program : B
{
public override void Test()
{
Console.WriteLine("Program sınıfındaki Test metodu çalıştı");
}
static void Main(string[] args)
{
}
}
Programı derlediğimizde alacağımız hata mesajı aşağıdaki gibi olacaktır.
'sealedKeyword.Program.Test()': cannot override inherited member 'sealedKeyword.B.Test()' because it is sealed
Framework içerisinden örnek vermek gerekirse; string tipi de sealed olarak işaretlenmiştir. Yani string tipinden kalıtım yapamayız.