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...");
    }
}

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.

challenge icon

Görev

Kolay

Kritik 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: Payments ad alanında (namespace) bir PaymentMethod sınıfı tanımlayın. Bu temel sınıfın bir Name özelliği (string) ve bunu ayarlayan bir yapıcı metodu (constructor) vardır. "Processing ${amount} via {Name}" değerini döndüren ProcessPayment(decimal amount) adında bir virtual metot ekleyin.
  • CreditCardPayment.cs: Payments ad alanında PaymentMethod sınıfından miras alan bir CreditCardPayment sınıfı tanımlayın. Bir CardNumber özelliği (string) ekleyin. Yapıcı metot, adı ve kart numarasını kabul eder ve adı iletmek için base kullanır. ProcessPayment metodunu sealed anahtar 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: Payments ad alanında PaymentMethod sınıfından miras alan BankTransfer adında sealed bir sınıf tanımlayın. Bu sınıfın tamamı mühürlenmiştir; hiç kimse ondan miras alamaz. Bir BankName özelliği (string) ekleyin. Yapıcı metot, adı ve banka adını kabul eder. ProcessPayment metodunu "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ı PaymentMethod referansları olarak saklayın ve mühürlü uygulamalarla polimorfizmi (çok biçimlilik) göstermek için her birinde ProcessPayment metodunu ç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 National

Temel 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
    }
}
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