🚀 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

Sınıflar ve Nesneler

Nesne yönelimli programlamaya giriyorsun: sınıf, nesne, alan, özellik, kurucu metot, static üye ve bir Direnç sınıfı yazıyorsun.

Sınıf nedir?

Şimdiye kadar veriyi (değişkenler) ve işlemi (metotlar) ayrı tuttuk. Sınıf bunları bir araya getirir: bir şeyin hem hangi bilgileri taşıdığını hem de neler yapabildiğini tanımlar. Sınıf bir kalıptır; o kalıptan üretilen her somut örneğe nesne denir.

Benzetme: "Direnç" kavramı sınıf; masandaki 1 kΩ'luk belirli direnç nesnedir. Her direncin bir değeri ve toleransı vardır, her biri güç hesaplayabilir.

İlk sınıf

var r1 = new Direnc { Deger = 1000, Tolerans = 5 };
Console.WriteLine($"{r1.Deger} ohm, %{r1.Tolerans}");
Console.WriteLine($"5 V'ta güç: {r1.GucHesapla(5):F3} W");

class Direnc
{
    public double Deger { get; set; }       // ohm
    public double Tolerans { get; set; }    // yüzde

    public double GucHesapla(double gerilim)
    {
        return gerilim * gerilim / Deger;   // P = V² / R
    }
}
1000 ohm, %5
5 V'ta güç: 0,025 W

new Direnc() bellekte yeni bir nesne oluşturur. Deger ve Tolerans birer özelliktir (property); nesnenin verisini tutar. GucHesapla ise nesnenin bir metodudur. Nesnenin üyelerine nokta ile ulaşılır: r1.Deger.

Not: Üst düzey ifadelerle çalışırken sınıf tanımlarını dosyanın sonuna ya da ayrı bir dosyaya koyman gerekir; üst düzey kodlar sınıflardan önce yazılmalıdır.

Kurucu metot (constructor)

Nesne oluşturulurken ilk değerleri vermeyi zorunlu kılmak için kurucu metot yazılır. Adı sınıfla aynıdır, dönüş tipi yoktur.

var r = new Direnc(470);
Console.WriteLine(r);
Console.WriteLine($"Gerçek değer {r.AltSinir:F1} ile {r.UstSinir:F1} arasında");

class Direnc
{
    public double Deger { get; }
    public double Tolerans { get; }

    public Direnc(double deger, double tolerans = 5)
    {
        if (deger <= 0)
            throw new ArgumentException("Direnç sıfırdan büyük olmalı.");
        Deger = deger;
        Tolerans = tolerans;
    }

    public double AltSinir => Deger * (1 - Tolerans / 100);
    public double UstSinir => Deger * (1 + Tolerans / 100);

    public override string ToString() => $"{Deger} Ω (±%{Tolerans})";
}
470 Ω (±%5)
Gerçek değer 446,5 ile 493,5 arasında

Burada üç yeni şey var: { get; } yalnızca okunabilir özellik (değer yalnızca kurucuda atanır); AltSinir hesaplanan bir özellik; ToString() metodunu override ederek nesnenin metin karşılığını belirledik. Böylece Console.WriteLine(r) anlamlı yazar.

Erişim belirleyicileri

  • public: her yerden erişilir.
  • private: yalnızca sınıfın kendi içinden. Hiçbir şey yazmazsan sınıf üyeleri varsayılan olarak private'tır.
  • protected: sınıftan ve onu miras alan sınıflardan (sonraki ders).

Veriyi gizleyip yalnızca kontrollü kapılardan (özellik, metot) açmaya kapsülleme denir. Örneğin Direnç sıfır olamaz kuralını kurucuda sağlamak, geçersiz nesne oluşmasını engeller.

static üyeler

static üye nesneye değil sınıfın kendisine aittir. Tüm nesnelerin ortak kullandığı bilgiler için uygundur:

var a = new Sayac();
var b = new Sayac();
Console.WriteLine(Sayac.ToplamNesne);   // 2

class Sayac
{
    public static int ToplamNesne { get; private set; }

    public Sayac()
    {
        ToplamNesne++;
    }
}

Console ve Math sınıfları da static'tir: onlardan nesne üretmeden Math.Sqrt(9) dersin.

Record: Yalnızca veri taşıyan sınıflar için record Olcum(string Kanal, double Deger); gibi tek satırlık kısa tanım vardır. Eşitlik ve yazdırma gibi şeyleri otomatik verir. LINQ dersinde kullanacağız.

Dikkat: Sınıflar referans tipidir. var y = x; yazınca nesne kopyalanmaz; iki değişken aynı nesneyi gösterir. Birinden yapılan değişiklik diğerinde de görünür.

Kendin dene

Sensor adında bir sınıf yaz: Ad ve Birim özellikleri, ölçüm değerlerini tutan bir List<double>, Ekle(double) metodu ve Ortalama() metodu olsun. İki sensör nesnesi oluştur, birkaç ölçüm ekle ve ortalamaları yazdır. Hiç ölçüm yokken Ortalama 0 döndürsün.

// Mini sınav

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

1. Sınıf ile nesne arasındaki ilişki nedir?
2. Kurucu metodun (constructor) özelliği hangisidir?
3. Bir üyeyi yalnızca sınıfın kendi içinden erişilebilir yapan belirleyici hangisidir?

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

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