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...");
}
}sealed anahtar sözcüğünün bir yöntemde override ile birlikte kullanılması gerektiğine dikkat edin. Yalnızca üst sınıfta zaten sanal olan bir yöntemi mühürleyebilirsiniz. Bu size hassas bir denetim sağlar: kalıtım hiyerarşisinde bazı özelleştirmelere izin verin, ardından belirli bir noktada bunu kilitleyin.
Görev
KolayKritik uygulamaların kullanımını kısıtlamak için sealed anahtar sözcüğünün 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 üzere mühürlendiği bir hiyerarşi oluşturacaksınız.
Kodunuzu düzenlemek için dört dosya oluşturacaksınız:
PaymentMethod.cs:PaymentMethodad alanında birPaymentssınıfı tanımlayın. Bu temel sınıfın birNameözelliği (string) ve bu özelliği ayarlayan bir oluşturucusu vardır.virtualdöndürenProcessPayment(decimal amount)adlı bir"Processing ${amount} via {Name}"metodu ekleyin.CreditCardPayment.cs:CreditCardPaymentad alanındaPaymentssınıfından miras alan birPaymentMethodsınıfı tanımlayın. BirCardNumberözelliği (string) ekleyin. Oluşturucu ad ve kart numarasını kabul etmeli, adı iletmek içinbasekullanmalıdır. Hiçbir alt sınıfın bu davranışı değiştirememesi içinProcessPaymentmetodunusealedanahtar sözcüğüyle geçersiz kılın. Metot,"Charging ${amount} to card ending in {last 4 digits of CardNumber}"döndürmelidir.BankTransfer.cs:sealedad alanındaBankTransferadlı birPaymentssınıf tanımlayın; bu sınıfPaymentMethodsınıfından miras almalıdır. Bu sınıfın tamamı mühürlüdür; hiç kimse bu sınıftan miras alamaz. BirBankNameözelliği (string) ekleyin. Oluşturucu ad ve banka adını kabul etmelidir.ProcessPaymentmetodunu geçersiz kılarak"Transferring ${amount} from {BankName}"döndürmesini sağlayın.Program.cs: Ana dosyanızda, girdi değerlerini kullanarak her üç ödeme türünün örneklerini oluşturun. BunlarıPaymentMethodbaşvuruları olarak saklayın ve mühürlü uygulamalarla çok biçimliliği göstermek için her birindeProcessPaymentmetodunu çağırın.
Dört girdi alacaksınız:
- Kredi kartı numarası (16 basamak)
- Banka adı
- Ödeme tutarı
Her yöntem aracılığıyla bir ödemenin işlenmesinin sonucunu yazdırın:
{base PaymentMethod result}
{CreditCardPayment result}
{BankTransfer result}Örneğin, girdiler 1234567890123456, First National ve 150.00 ise çıktı şu şekilde olmalıdır:
Processing $150.00 via Generic
Charging $150.00 to card ending in 3456
Transferring $150.00 from First NationalTemel "Generic" örneğinin adı olarak PaymentMethod, 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ı herhangi bir miras almayı önler; her ikisi de ödeme sistemlerinde önemli güvenlik kalıplarıdır!
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ıKendi başına pratik yap: Online C# derleyicisi