Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Kritik 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: PaymentMethod ad alanında bir Payments sınıfı tanımlayın. Bu temel sınıfın bir Name özelliği (string) ve bu özelliği ayarlayan bir oluşturucusu vardır. virtual döndüren ProcessPayment(decimal amount) adlı bir "Processing ${amount} via {Name}" metodu ekleyin.
  • CreditCardPayment.cs: CreditCardPayment ad alanında Payments sınıfından miras alan bir PaymentMethod sınıfı tanımlayın. Bir CardNumber özelliği (string) ekleyin. Oluşturucu ad ve kart numarasını kabul etmeli, adı iletmek için base kullanmalıdır. Hiçbir alt sınıfın bu davranışı değiştirememesi için ProcessPayment metodunu sealed anahtar 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: sealed ad alanında BankTransfer adlı bir Payments sınıf tanımlayın; bu sınıf PaymentMethod sı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. Bir BankName özelliği (string) ekleyin. Oluşturucu ad ve banka adını kabul etmelidir. ProcessPayment metodunu 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ı PaymentMethod başvuruları olarak saklayın ve mühürlü uygulamalarla çok biçimliliği göstermek için her birinde ProcessPayment metodunu ç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 National

Temel "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
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online C# derleyicisi