🚀 C# ile Programlamaya Giriş: Kodlamaya İlk Adımını At, Kendi Projelerini Geliştirmeye Başla!
00ANASAYFA 01YAZILAR 02EĞİTİM 03ELEKTRİK_ENERJİ 04OTOMOTİV_MÜHENDİSLİĞİ 05ARAÇLAR 06LAB 07SÖZLÜK 08ETİKETLER ♡OKUMA LİSTEM ⌕ARA
TRENG

Kalıtım, Soyut Sınıflar ve Arayüzler

Ortak özellikleri üst sınıfa taşımayı, virtual/override ile çok biçimliliği ve interface ile sözleşme tanımlamayı sensör örneğiyle öğreniyorsun.

Kalıtım: ortak olanı bir yere koy

Sıcaklık sensörü, basınç sensörü, nem sensörü... Hepsinin bir adı var ve hepsi bir değer okuyor. Ortak kısmı her sınıfa kopyalamak yerine bir üst sınıfa yazar, diğerlerini ondan türetirsin. Türeyen sınıf, üst sınıfın üyelerini miras alır.

class Sensor
{
    public string Ad { get; }
    public Sensor(string ad) { Ad = ad; }

    public virtual double Oku()
    {
        return 0;
    }

    public override string ToString() => $"{Ad}: {Oku():F1}";
}

class SicaklikSensoru : Sensor
{
    public SicaklikSensoru(string ad) : base(ad) { }

    public override double Oku()
    {
        return 23.5;   // gerçekte donanımdan okunur
    }
}

class NemSensoru : Sensor
{
    public NemSensoru(string ad) : base(ad) { }

    public override double Oku() => 48.2;
}

İki işaret: : Sensor "Sensor'dan türer" demektir. base(ad) üst sınıfın kurucusunu çağırır. Üst sınıftaki virtual anahtar sözcüğü "bu metodu alt sınıflar değiştirebilir" izni, alt sınıftaki override ise gerçek değiştirmedir.

Çok biçimlilik (polymorphism)

Asıl güç burada: farklı türleri ortak üst sınıf tipiyle bir arada tutup aynı çağrıyı yaparsın; her nesne kendi davranışını uygular.

var sensorler = new List<Sensor>
{
    new SicaklikSensoru("LM35"),
    new NemSensoru("DHT22")
};

foreach (Sensor s in sensorler)
{
    Console.WriteLine(s);    // ToString -> Oku()
}
LM35: 23,5
DHT22: 48,2

Listeye yeni bir sensör türü eklediğinde, bu döngüyü değiştirmen gerekmez. Bu, büyük yazılımları yönetilebilir kılan temel fikirlerden biridir.

Soyut sınıflar

"Sensor" tek başına bir şey değil; yalnızca kavram. Doğrudan nesnesi üretilmesin ve alt sınıflar Oku metodunu yazmak zorunda kalsın istiyorsan abstract kullan:

abstract class Sensor
{
    public string Ad { get; }
    protected Sensor(string ad) { Ad = ad; }

    public abstract double Oku();   // gövdesi yok, alt sınıf doldurur
}

Artık new Sensor("x") yazarsan derleme hatası alırsın; ve Oku'yu yazmayan bir türev derlenmez. protected kurucu da yalnızca alt sınıfların çağırabileceğini gösterir.

Arayüzler (interface)

Arayüz bir sözleşmedir: "bu arayüzü uygulayan her sınıf şu üyelere sahiptir". İçinde işlem yoktur, yalnızca imzalar vardır. Bir sınıf yalnızca bir sınıftan türeyebilir ama birden çok arayüz uygulayabilir. Adlar geleneksel olarak I ile başlar.

var v = new Voltmetre();
v.Kalibre(0.05);
Console.WriteLine(v.KayitSatiri());

interface IKalibre
{
    void Kalibre(double sapma);
}

interface IKayitlanabilir
{
    string KayitSatiri();
}

class Voltmetre : IKalibre, IKayitlanabilir
{
    private double _sapma;

    public void Kalibre(double sapma) => _sapma = sapma;

    public double Oku() => 3.30 + _sapma;

    public string KayitSatiri() => $"VOLT;{Oku():F2}";
}
VOLT;3,35

Başındaki alt çizgi (_sapma) özel alanlar için yaygın bir adlandırma alışkanlığıdır.

is ve as: türü sorgulamak

Sensor s = new SicaklikSensoru("LM35");

if (s is SicaklikSensoru sicaklik)
{
    Console.WriteLine($"Bu bir sıcaklık sensörü: {sicaklik.Ad}");
}

Hangisi? "X bir Y'dir" ilişkisi varsa kalıtım (SicaklikSensoru bir Sensor'dür). "X şunu yapabilir" ilişkisi varsa arayüz (Voltmetre kalibre edilebilir). Kalıtımı ince bir şeyi paylaşmak için aşırı kullanma; arayüz çoğu zaman daha esnektir.

Dikkat: override edebilmek için üst sınıftaki metot virtual ya da abstract olmak zorundadır. Aksi halde derleyici hata verir.

Kendin dene

Soyut bir Sekil sınıfı yaz (Alan() soyut metot). Daire ve Dikdortgen sınıflarını türet. Bir listeye karışık şekiller koyup toplam alanı hesapla. Sonra IYazdirilabilir adlı bir arayüz tanımla ve şekillerden birine uygulat.

// Mini sınav

Bir seçeneğe tıkla; doğru mu yanlış mı, anında ve nedeniyle birlikte göreceksin.

1. Alt sınıfın üst sınıftaki bir metodu değiştirebilmesi için üst sınıfta metot nasıl işaretlenmelidir?
2. Soyut (abstract) bir sınıf hakkında hangisi doğrudur?
3. Bir sınıf kaç arayüz uygulayabilir?

Bitirdiğinde işaretle: ilerlemen kaydolur, +20 XP kazanırsın.

İpucu: ← → tuşlarıyla dersler arasında gezinebilirsin.