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.
Bitirdiğinde işaretle: ilerlemen kaydolur, +20 XP kazanırsın.
İpucu: ← → tuşlarıyla dersler arasında gezinebilirsin.