İçeriğe geç

Menü

Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

C# Kalıtım Nedir? base, virtual ve override Nasıl Kullanılır?

csharp-kalitim-nedir-base-virtual-override-nasil-kullanilir
Bu yazıda neler var?
  1. C# kalıtım nedir? Temel ve türetilmiş sınıf ilişkisi
  2. Erişim belirleyicileri ortak davranışın sınırlarını nasıl belirler?
  3. base, virtual, override ve abstract nasıl birlikte kullanılır?
  4. Çalışan örnek: Bildirim temel sınıfı ve e-posta bildirimi
  5. new ile override arasındaki temel fark nedir?
  6. Kalıtım kararını uygulamak için kısa kontrol listesi
  7. Sık Sorulan Sorular

C# kalıtım, bir sınıfın erişilebilir üyelerini başka bir sınıfa aktarmasını sağlayan nesne yönelimli programlama yapısıdır. base, temel sınıftaki üyelere erişmek; virtual, türetilmiş sınıf tarafından değiştirilebilecek davranış tanımlamak; override ise bu davranışın türe özgü uygulamasını yazmak için kullanılır.

Kalıtımda ortak özellik ve davranışlar temel sınıfta toplanır, farklılaşan ayrıntılar türetilmiş sınıfa bırakılır. Bununla birlikte, sınıflar arasında gerçek bir “bir türüdür” ilişkisi yoksa kalıtım otomatik olarak seçilmemeli, farklı tasarım ilişkileri de değerlendirilmelidir.

C# kalıtım nedir? Temel ve türetilmiş sınıf ilişkisi

Kalıtımda üstte bulunan sınıfa temel sınıf, ondan türeyen sınıfa ise türetilmiş sınıf denir. Türetilmiş sınıf, erişim kurallarının izin verdiği üyeleri temel sınıftan devralır ve kendi özelliklerini ya da metotlarını ekleyebilir. C# dilinde bu ilişki, sınıf tanımında iki nokta kullanılarak kurulur: class Kedi : Hayvan.

Basit bir sınıf şeması şöyle düşünülebilir: Hayvan temel sınıftır, Kedi ise türetilmiş sınıftır. Hayvanın adı ve kendini tanıtması gibi ortak davranışlar temel sınıfta yer alırken, miyavlama gibi yalnızca kediye özgü davranışlar türetilmiş sınıfa eklenir.

using System;

class Hayvan
{
    public string Ad { get; set; } = "";

    public void Tanit()
    {
        Console.WriteLine($"Hayvan: {Ad}");
    }
}

class Kedi : Hayvan
{
    public void Miyavla()
    {
        Console.WriteLine("Miyav");
    }
}

class Program
{
    static void Main()
    {
        Kedi kedi = new Kedi { Ad = "Misket" };
        kedi.Tanit();
        kedi.Miyavla();
    }
}

Beklenen çıktı:

Hayvan: Misket
Miyav

Bu örnekte Ad özelliği ile Tanit metodu Hayvan sınıfından gelir. Miyavla metodu ise yalnızca Kedi sınıfına aittir. Böylece ortak olan temel sınıfta, farklı olan türetilmiş sınıfta tutulur. Kavramları pekiştirmek için ücretsiz C# bilgi testi üzerinde temel sınıf ve türetilmiş sınıf ilişkisini deneyebilirsin.

Erişim belirleyicileri ortak davranışın sınırlarını nasıl belirler?

Erişim belirleyicileri ortak davranışın sınırlarını nasıl belirler?

Erişim belirleyicileri, temel sınıftaki üyelerin hangi kod bölümlerinden kullanılabileceğini belirler. Kalıtım ilişkisi kurmak, her üyenin türetilmiş sınıftan doğrudan kullanılabileceği anlamına gelmez.

  • public: Üye, erişim kısıtlaması olmayan kod bölümlerinden ve türetilmiş sınıftan kullanılabilir.
  • protected: Üye, tanımlandığı temel sınıfın içinden ve türetilmiş sınıflardan doğrudan kullanılabilir. Ancak sınıf dışındaki her kod tarafından kullanılamaz.
  • private: Üye yalnızca tanımlandığı sınıfın içinden kullanılabilir. Türetilmiş sınıf, bu üyeye doğrudan erişemez. Temel sınıf isterse üyeye erişen public veya protected bir metot sağlayabilir.
  • internal: Üye, aynı derleme birimi içindeki kodlar tarafından kullanılabilir. Türetilmiş sınıf aynı derleme birimindeyse üyeye erişebilir, farklı bir derleme birimindeyse doğrudan erişemez.

Temel sınıfa, bütün alt türlerde anlamlı olan ortak veri ve davranışları koymak uygun bir başlangıçtır. Yalnızca belirli bir türe ait alanlar ve metotlar ise türetilmiş sınıfta kalmalıdır. Özellikle protected üyeleri gereğinden fazla kullanmak yerine, temel sınıfın hangi davranışları kontrollü biçimde açacağını belirlemek daha sağlıklı olabilir.

İki sınıf arasında gerçek bir “bir türüdür” ilişkisi bulunmuyorsa kalıtımı yalnızca kod tekrarını azaltmak için seçme. Bir nesnenin başka bir nesneyi içermesi gibi “sahiptir” ilişkilerinde bileşim, ortak bir yeteneği temsil etmekte ise arayüz kullanımı değerlendirilebilir.

base, virtual, override ve abstract nasıl birlikte kullanılır?

Bu anahtar sözcükler kalıtım ilişkisinde farklı görevler üstlenir. virtual, temel sınıftaki davranışın değiştirilebilmesine izin verir. override, türetilmiş sınıfta bu davranışı yeniden tanımlar. base, temel sınıftaki üyeye veya kurucuya erişir. abstract ise temel sınıfta uygulama sunmadan, gerekli davranışı türetilmiş sınıfa bırakır.

İlişki şeması: virtual temel davranışı değiştirilebilir kılar → override türetilmiş sınıfta yeni davranışı tanımlar → base temel uygulamaya erişir. abstract üye ise temel uygulama sağlamaz ve türetilmiş sınıfa uygulama sorumluluğu verir.

  • base: base.Send() ile temel sınıftaki metot çağrılabilir. : base(recipient) sözdizimiyle temel sınıfın kurucusu çalıştırılabilir.
  • virtual: Temel sınıftaki metodun türetilmiş sınıfta değiştirilmesine izin verir.
  • override: Temel sınıftaki sanal davranışın yeni uygulamasını yazar.
  • abstract: Temel uygulama sunmaz. Bu üyeyi kullanan türetilmiş sınıf, gerekli metodu uygulamalıdır.

override kullanabilmek için temel üyenin virtual, abstract veya sealed ile kapatılmamış başka bir override olması gerekir.

Çalışan örnek: Bildirim temel sınıfı ve e-posta bildirimi

Çalışan örnek: Bildirim temel sınıfı ve e-posta bildirimi

Aşağıdaki örnekte Notification temel sınıfı genel bir bildirim davranışı sunar. EmailNotification ise : base(recipient) ile temel kurucuyu çağırır ve Send metodunu yeniden tanımlar. base.Send() çağrısı, temel davranışın da korunmasını sağlar.

using System;

class Notification
{
    protected string Recipient { get; }

    public Notification(string recipient)
    {
        Recipient = recipient;
    }

    public virtual void Send()
    {
        Console.WriteLine($"Genel bildirim: {Recipient}");
    }
}

class EmailNotification : Notification
{
    public EmailNotification(string recipient) : base(recipient)
    {
    }

    public override void Send()
    {
        base.Send();
        Console.WriteLine($"E-posta bildirimi gönderildi: {Recipient}");
    }
}

class Program
{
    static void Main()
    {
        Notification notification =
            new EmailNotification("[email protected]");

        notification.Send();
    }
}

Beklenen çıktı

Genel bildirim: [email protected]
E-posta bildirimi gönderildi: [email protected]

notification değişkeninin türü Notification olsa da oluşturulan nesne EmailNotification türündedir. Send metodu virtual ve override ile tanımlandığı için çalışma anında türetilmiş sınıftaki uygulama seçilir. Önce base.Send() genel bildirim satırını, ardından e-posta sınıfındaki kod ikinci satırı yazdırır.

new ile override arasındaki temel fark nedir?

new anahtar sözcüğü, türetilmiş sınıftaki aynı adlı üyeyi temel sınıftaki üyeden bağımsız olarak gizler. override ise temel sınıfta virtual, abstract veya yeniden override edilebilir olarak tanımlanan üyeyi değiştirir. Bu nedenle new kullanmak, override ile otomatik olarak aynı sonucu vermez.

using System;

class Temel
{
    public virtual string Mesaj()
    {
        return "Temel";
    }
}

class NewTuru : Temel
{
    public new string Mesaj()
    {
        return "new";
    }
}

class OverrideTuru : Temel
{
    public override string Mesaj()
    {
        return "override";
    }
}

class Program
{
    static void Main()
    {
        Temel a = new NewTuru();
        Temel b = new OverrideTuru();
        NewTuru c = new NewTuru();

        Console.WriteLine(a.Mesaj());
        Console.WriteLine(b.Mesaj());
        Console.WriteLine(c.Mesaj());
    }
}

Beklenen çıktı:

Temel
override
new

a değişkeni Temel türünde bir referansa sahip olduğu için new ile gizlenen üye değil, temel sınıftaki üye çağrılır. b değişkeninde ise override kullanıldığı için nesnenin gerçek türüne uygun davranış seçilir. Bu fark, çok biçimli yapılar kurarken önemlidir.

Özellik new override
Temel üye koşulu Aynı adlı bir üye bulunması yeterlidir. Temel üyenin virtual olması gerekmez. Temel üye virtual, abstract veya yeniden override edilebilir olmalıdır.
Temel sınıf türünden referansla çağrı Seçim, çoğunlukla referans türünün gördüğü üyeye göre yapılır. Nesnenin gerçek türündeki geçersiz kılınmış davranış seçilir.
Çok biçimlilik etkisi Temel sınıf referansı üzerinden türe özgü davranışı otomatik olarak sağlamaz. Temel sınıf referansı üzerinden türe özgü davranışın çalışmasını sağlar.
Kullanım amacı Aynı adlı temel sınıf üyesini bilinçli olarak gizlemek. Temel davranışı türe göre yeniden tanımlamak.

Kalıtım kararını uygulamak için kısa kontrol listesi

Kalıtım her durumda ilk seçenek değildir. Sadece kod paylaşmak için oluşturulan gereksiz katmanlar, sınıflar arasındaki ilişkiyi anlamayı zorlaştırabilir. Aşağıdaki beş soruyu yanıtlayarak daha bilinçli bir karar verebilirsin:

  1. Gerçek bir kalıtım ilişkisi var mı? Türetilmiş sınıf, temel sınıfın bir türü olarak anlamlı mı? Yoksa yalnızca bazı kodları paylaşmak için mi kalıtım düşünülüyor?
  2. Ortak veri ve davranış nedir? Alan, özellik ve metotlardan gerçekten ortak olanları belirle. Sadece isim benzerliği, kalıtım için tek başına yeterli değildir.
  3. Türe özgü fark nedir? Türetilmiş sınıf temel davranışa ne ekliyor veya hangi davranışı değiştiriyor? Bu fark açıkça ifade edilemiyorsa tasarımı yeniden düşün.
  4. Davranış değiştirilecekse virtual ve override uygun mu? Temel sınıf referansı üzerinden de türe özgü davranışın çalışması gerekiyorsa bu mekanizma anlamlı olabilir.
  5. Ortak sınıf eksik bir şablon mu? Temel sınıf tek başına anlamlı bir nesne oluşturmuyor ve bazı davranışları alt sınıflara bırakıyorsa abstract sınıf uygun olabilir.

Bu kararları dilden bağımsız bir problem çözme pratiğiyle pekiştirmek için dilden bağımsız Algoritmik Düşünme Testi üzerinden koşul, ilişki ve sonuçları ayrı ayrı değerlendirebilirsin.

Sık Sorulan Sorular

base anahtar sözcüğü temel sınıfın üyesine ve kurucusuna nasıl erişir?

base.Üye biçimiyle temel sınıftaki erişilebilir üyeye ulaşılır. Temel sınıf kurucusu ise türetilmiş sınıf kurucusunda : base(...) biçimiyle çağrılır.

override kullanmak için temel sınıf üyesi nasıl tanımlanmalıdır?

Temel sınıf üyesi virtual, abstract veya yeniden geçersiz kılınabilir bir override olarak tanımlanmalıdır. Üyenin imzası da türetilmiş sınıftaki bildirimle uyumlu olmalıdır.

new ile override arasındaki fark nedir?

new, aynı adlı üyeyi gizler ve çağrı seçimi referans türünden etkilenebilir. override ise kalıtımsal davranışı yeniden tanımlar ve çok biçimli çağrılarda nesnenin gerçek türüne uygun davranışın seçilmesini sağlar.

abstract sınıf ile virtual üye arasındaki fark nedir?

abstract sınıf doğrudan örneklenemez ve alt sınıflar için eksik bir şablon sunabilir. virtual üyenin temel sınıfta bir uygulaması bulunur; alt sınıf isterse bu davranışı override ile değiştirebilir.

Kalıtımda iyi bir karar, ortaklığı doğru yerde kurup türe özgü davranışı uygun anahtar sözcükle ifade etmeye dayanır.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara