Sealed Sınıflar
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 22 / 70.
Bazen kalıtım zincirini durdurmak istersiniz. sealed anahtar kelimesi, bir sınıfın miras alınmasını engelleyerek uygulamasını kilitler ve başka hiçbir sınıfın onu genişletememesini sağlar.
public sealed class FinalDog : Animal
{
public override void Speak()
{
Console.WriteLine("Woof!");
}
}
// Bu bir derleme hatasına yol açar:
// public class SuperDog : FinalDog { }Bir sınıfı neden mühürlersiniz? Güvenlik ve tasarım bütünlüğü yaygın nedenlerdir. Bir sınıfı dikkatlice tasarladığınızda ve kimsenin kalıtım yoluyla davranışını değiştirmesini istemediğinizde, onu mühürlemek uygulamanızın bozulmadan kalmasını garanti eder.
Tüm sınıflar yerine tekil metotları da mühürleyebilirsiniz. Bu, sınıfın kendisinin miras alınmasına izin vermeye devam ederken daha fazla geçersiz kılma (overriding) işlemini engeller:
public class Dog : Animal
{
public sealed override void Speak()
{
Console.WriteLine("Woof!");
}
}
public class Puppy : Dog
{
// Speak() metodu geçersiz kılınamaz - sealed (mühürlüdür)
// Ancak yeni metotlar eklenebilir
public void Whimper()
{
Console.WriteLine("Whimper...");
}
}Bir metot üzerindeki sealed anahtar kelimesinin override ile birlikte kullanılması gerektiğini unutmayın. Yalnızca bir üst sınıfta zaten virtual olan bir metodu mühürleyebilirsiniz. Bu size hassas bir kontrol sağlar: kalıtım hiyerarşisinde bazı özelleştirmelere izin verin, ardından belirli bir noktada bunu kilitleyin.
Görev
KolayKritik uygulamaları kilitlemek için sealed anahtar kelimesinin nasıl kullanılacağını gösteren bir ödeme işleme sistemi oluşturalım. Belirli ödeme yöntemlerinin genişletilebildiği, ancak en güvenli olanların herhangi bir değişikliği önlemek için mühürlendiği (sealed) bir hiyerarşi oluşturacaksınız.
Kodunuzu düzenlemek için dört dosya oluşturacaksınız:
PaymentMethod.cs:Paymentsad alanında (namespace) birPaymentMethodsınıfı tanımlayın. Bu temel sınıfın birNameözelliği (string) ve bunu ayarlayan bir yapıcı metodu (constructor) vardır."Processing ${amount} via {Name}"değerini döndürenProcessPayment(decimal amount)adında birvirtualmetot ekleyin.CreditCardPayment.cs:Paymentsad alanındaPaymentMethodsınıfından miras alan birCreditCardPaymentsınıfı tanımlayın. BirCardNumberözelliği (string) ekleyin. Yapıcı metot, adı ve kart numarasını kabul eder ve adı iletmek içinbasekullanır.ProcessPaymentmetodunusealedanahtar kelimesiyle geçersiz kılın (override), böylece daha sonra türetilen hiçbir sınıf bu davranışı değiştiremez. Bu metot"Charging ${amount} to card ending in {last 4 digits of CardNumber}"değerini döndürmelidir.BankTransfer.cs:Paymentsad alanındaPaymentMethodsınıfından miras alanBankTransferadındasealedbir sınıf tanımlayın. Bu sınıfın tamamı mühürlenmiştir; hiç kimse ondan miras alamaz. BirBankNameözelliği (string) ekleyin. Yapıcı metot, adı ve banka adını kabul eder.ProcessPaymentmetodunu"Transferring ${amount} from {BankName}"döndürecek şekilde geçersiz kılın.Program.cs: Ana dosyanızda, giriş değerlerini kullanarak her üç ödeme türünden örnekler oluşturun. BunlarıPaymentMethodreferansları olarak saklayın ve mühürlü uygulamalarla polimorfizmi (çok biçimlilik) göstermek için her birindeProcessPaymentmetodunu çağırın.
Dört giriş alacaksınız:
- Kredi kartı numarası (16 hane)
- Banka adı
- Ödeme tutarı
Her yöntemle bir ödemeyi işlemenin sonucunu yazdırın:
{base PaymentMethod result}
{CreditCardPayment result}
{BankTransfer result}Örneğin, girişler 1234567890123456, First National ve 150.00 ise çıktı şöyle olmalıdır:
Processing $150.00 via Generic
Charging $150.00 to card ending in 3456
Transferring $150.00 from First NationalTemel PaymentMethod örneği için ad olarak "Generic", kredi kartı ödemesi için "Credit Card" ve banka havalesi için "Bank Transfer" kullanın.
CreditCardPayment içindeki mühürlü metot, birisi bir alt sınıf oluşturursa kredi kartı ödemelerinin işlenme şeklini değiştirememesini sağlar. Mühürlü BankTransfer sınıfı ise herhangi bir miras almayı tamamen engeller; her ikisi de ödeme sistemlerinde önemli güvenlik modelleridir!
Kopya kağıdı
sealed anahtar kelimesi, bir sınıfın miras alınmasını veya bir metodun kalıtım zincirinde daha fazla geçersiz kılınmasını (override edilmesini) engeller.
Bir sınıfı mühürlemek:
public sealed class FinalDog : Animal
{
public override void Speak()
{
Console.WriteLine("Woof!");
}
}
// This would cause a compile error:
// public class SuperDog : FinalDog { }Mühürlü (sealed) sınıflar, uygulamanın kalıtım yoluyla değiştirilememesini sağlayarak güvenlik ve tasarım bütünlüğü için kullanılır.
Bir metodu mühürlemek:
public class Dog : Animal
{
public sealed override void Speak()
{
Console.WriteLine("Woof!");
}
}
public class Puppy : Dog
{
// Cannot override Speak() - it's sealed
// But can add new methods
public void Whimper()
{
Console.WriteLine("Whimper...");
}
}Bir metot üzerindeki sealed anahtar kelimesi, override ile birlikte kullanılmalıdır. Sadece bir üst sınıfta zaten virtual olan metotları mühürleyebilirsiniz. Bu, hiyerarşide belirli bir noktaya kadar özelleştirmeye izin verir, ardından onu kilitler.
Kendin dene
using System;
using Payments;
class Program
{
public static void Main(string[] args)
{
// Girdileri oku
string cardNumber = Console.ReadLine();
string bankName = Console.ReadLine();
decimal amount = Convert.ToDecimal(Console.ReadLine());
// TODO: "Generic" isimli bir temel PaymentMethod örneği oluşturun
// Bunu bir PaymentMethod referansı olarak saklayın
// TODO: "Credit Card" isimli ve kart numarasına sahip bir CreditCardPayment örneği oluşturun
// Bunu bir PaymentMethod referansı olarak saklayın
// TODO: "Bank Transfer" isimli ve banka adına sahip bir BankTransfer örneği oluşturun
// Bunu bir PaymentMethod referansı olarak saklayın
// TODO: Her biri üzerinde ProcessPayment metodunu çağırın ve sonuçları yazdırın
// Her sonuç kendi satırında olmalıdır
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları