CodeBlanks Logo Icon CodeBlanks

Metot gizleme (new)

C# kursu · Orta seviye · Ders 60/116

new ile base metodu gizlemeyi ve farkını öğrenirsin.

new ile metot gizleme

Bazen türetilmiş sınıfta taban metodu geçersiz kılmak değil, gizlemek istersin. Bunun için override yerine new anahtar kelimesini kullanırsın.

Önemli fark: new ile gizleme derleme zamanı çağrısıdır. Yani referans türü hangi sınıfsa, o sınıfın metodu çalışır. Base b = new Derived(); yazıp b.Greet() çağırırsan Base.Greet çalışır; çünkü b değişkeni Base türünde. virtual/override kullanılmadığı için runtime seçimi olmaz.

Referans türü seçer

Gizleme senaryosunda iki farklı çağrı iki farklı sonuç verir. Derived d = new Derived(); d.Greet(); çağrısı Derived.Greet'i çalıştırır. Aynı nesneyi Base b = d; ile taban referansa atarsan, b.Greet() artık Base.Greet'i çalıştırır.

Yani gizlemede nesne değil, referans türü belirleyicidir. Bu davranış programcıyı şaşırtabilir; bu yüzden derleyici new anahtar kelimesini yazmazsan uyarı verir. Uyarıyı kapatmak için bilinçli olarak new yazmalısın.

Uygulama new ile gizleme göster

Base sınıfı tanımla; public void Greet() metodu Console.WriteLine("Base merhaba") yazsın. Derived : Base sınıfı tanımla; Greet'i new ile gizleyip Console.WriteLine("Derived merhaba") yazsın. Main içinde Base b = new Derived(); ile b.Greet() çağır.

Örnek çözümü göster
Base { public new void Greet() { Console.WriteLine("Derived merhaba"); } } yaz. Main içine Base b = new Derived(); b.Greet(); ekle.
Örnek çözüm:
using System;

class Base
{
    public void Greet()
    {
        Console.WriteLine("Base merhaba");
    }
}

class Derived : Base
{
    public new void Greet()
    {
        Console.WriteLine("Derived merhaba");
    }
}

class Program
{
    static void Main()
    {
        Base b = new Derived();
        b.Greet();
    }
}

Kendini test et

  1. Gizleme anahtar kelimesi

    public ____ void Greet() { } // taban metodu gizler
    Cevabı göster
    public new void Greet() { } // taban metodu gizler
  2. Bu kodun çıktısı ne olur?

    Base b = new Derived();
    b.Greet();
    // Derived.Greet new ile gizler
    • Derived.Greet çalışır
    • Base.Greet çalışır
    • Her ikisi de çalışır
    • Çalışma zamanı hatası verir
    Cevabı göster

    Base.Greet çalışır — Doğru. new ile gizlemede referans türü belirler: Base.Greet çalışır.

  3. Anahtar kelimeyi davranışına eşle

    new
    Metodu gizler
    override
    Sanal metodu değiştirir
    virtual
    Geçersiz kılınabilir yapar
    sealed
    Geçersiz kılmayı durdurur

Orta seviye bölümündeki tüm dersler