Ahmet Balaman LogoAhmet Balaman

C# Class ve Object: Taslak mı, Ürün mü?

personAhmet Balaman
calendar_today
C#OOPClassObject.NETProgramlama Temelleri

Class ve Object: Kafamda Şimşekler Çaktı

OOP öğrenirken en çok zorlandığım kısım başlangıçtı. Class nedir, Object nedir, ne farkları var? Herkes "Class bir blueprint'tir" diyordu ama bu ne demek tam anlayamıyordum.

Ta ki bir gün mutfakta kek yaparken anladım: Class kek kalıbı, Object ise o kalıptan çıkan kekler!

Kek Kalıbı Analojisi

Düşünün: Elinizde kalp şeklinde bir kek kalıbı var.

  • Kalıp (Class): Kekin nasıl görüneceğini tanımlar. Şekli, boyutu belli.
  • Kekler (Objects): O kalıptan çıkan somut ürünler. Her biri ayrı bir kek.

Kalıbı yiyemezsiniz, ama kalıptan çıkan kekleri yiyebilirsiniz. Aynı kalıptan istediğiniz kadar kek çıkarabilirsiniz ve her kek birbirinden bağımsızdır.

// Bu bir Class - Kek kalıbı
public class Kek
{
    public string Lezzet { get; set; }
    public string Renk { get; set; }
    public int Dilim { get; set; }
}

// Bunlar Object'ler - Kalıptan çıkan kekler
Kek cikolataliKek = new Kek();
cikolataliKek.Lezzet = "Çikolatalı";
cikolataliKek.Renk = "Kahverengi";
cikolataliKek.Dilim = 8;

Kek muzluKek = new Kek();
muzluKek.Lezzet = "Muzlu";
muzluKek.Renk = "Sarı";
muzluKek.Dilim = 6;

cikolataliKek ve muzluKek aynı kalıptan (Class) çıktılar ama tamamen farklı ürünler (Object). Birinin dilimini yemek, diğerini etkilemiyor.

Class Nedir?

Class, bir şeyin nasıl olacağını tanımlayan şablondur. İçinde:

  • Property (Özellikler): O şeyin özellikleri. Renk, boyut, isim gibi.
  • Method (Metodlar): O şeyin yapabildiği eylemler. Çalış, dur, hesapla gibi.
public class Araba
{
    // Properties - Arabanın özellikleri
    public string Marka { get; set; }
    public string Model { get; set; }
    public string Renk { get; set; }
    public int Hiz { get; set; }
    public bool MotorCalisiyorMu { get; set; }
    
    // Methods - Arabanın davranışları
    public void MotoruCalistir()
    {
        MotorCalisiyorMu = true;
        Console.WriteLine($"{Marka} {Model} motoru çalıştı!");
    }
    
    public void MotoruDurdur()
    {
        MotorCalisiyorMu = false;
        Hiz = 0;
        Console.WriteLine($"{Marka} {Model} motoru durdu.");
    }
    
    public void Hizlan(int miktar)
    {
        if (MotorCalisiyorMu)
        {
            Hiz += miktar;
            Console.WriteLine($"{Marka} hızlandı! Şu anki hız: {Hiz} km/sa");
        }
        else
        {
            Console.WriteLine("Önce motoru çalıştırmalısınız!");
        }
    }
}

Bu Araba class'ı tek başına hiçbir şey yapmaz. Sadece "bir araba şöyle olur" der. Gerçek arabalar oluşturmak için instance (örnek) yaratmamız gerekiyor.

Object Nedir?

Object, class'tan oluşturulan somut örnektir. Her object bellekte kendi alanını kaplar ve kendi değerlerini tutar.

// Instance (Object) oluşturma
Araba benim_arabam = new Araba();
benim_arabam.Marka = "Toyota";
benim_arabam.Model = "Corolla";
benim_arabam.Renk = "Beyaz";

Araba babamin_arabasi = new Araba();
babamin_arabasi.Marka = "Ford";
babamin_arabasi.Model = "Focus";
babamin_arabasi.Renk = "Mavi";

// Her araba bağımsız çalışır
benim_arabam.MotoruCalistir();
benim_arabam.Hizlan(50);

babamin_arabasi.MotoruCalistir();
babamin_arabasi.Hizlan(30);

// Çıktı:
// Toyota Corolla motoru çalıştı!
// Toyota hızlandı! Şu anki hız: 50 km/sa
// Ford Focus motoru çalıştı!
// Ford hızlandı! Şu anki hız: 30 km/sa

Benim arabamın hızlanması, babamın arabasını etkilemiyor. İkisi de aynı "Araba" class'ından türedi ama artık bağımsız nesneler.

Property vs Field: Küçük Ama Önemli Fark

C#'ta iki terim var: Field ve Property. Başlangıçta karıştırılıyor ama farkı önemli.

public class Ogrenci
{
    // Field - Doğrudan değişken
    public string ad;  // ❌ Tavsiye edilmez
    
    // Property - Get/Set ile kontrollü erişim
    public string Ad { get; set; }  // ✅ Tercih edilmeli
    
    // Property with backing field - Tam kontrol
    private int _yas;
    public int Yas
    {
        get { return _yas; }
        set 
        { 
            if (value >= 0 && value <= 150)
                _yas = value;
            else
                Console.WriteLine("Geçersiz yaş!");
        }
    }
}

Property kullanmanın avantajı: Değer atanırken veya okunurken kontrol yapabilirsiniz. Yukarıdaki örnekte yaş olarak -5 veya 200 gibi saçma değerler atanamaz.

Method: Nesnelerin Yetenekleri

Method, bir nesnenin yapabildiği eylemdir. Parametre alabilir, değer döndürebilir.

public class Hesaplayici
{
    // Parametre alan method
    public int Topla(int a, int b)
    {
        return a + b;
    }
    
    // Birden fazla parametre
    public double Ortalama(double x, double y, double z)
    {
        return (x + y + z) / 3;
    }
    
    // Parametre almayan method
    public void Selamla()
    {
        Console.WriteLine("Merhaba, hesaplayıcı hazır!");
    }
    
    // void - Değer döndürmeyen
    public void SonucuYazdir(int sonuc)
    {
        Console.WriteLine($"Sonuç: {sonuc}");
    }
}

// Kullanım
Hesaplayici hesap = new Hesaplayici();
hesap.Selamla();

int toplam = hesap.Topla(5, 3);
hesap.SonucuYazdir(toplam);

double ort = hesap.Ortalama(80, 90, 70);
Console.WriteLine($"Ortalama: {ort}");

Gerçek Dünya Örneği: Kütüphane Sistemi

Şimdi öğrendiklerimizi birleştirelim. Basit bir kütüphane yönetim sistemi tasarlayalım:

public class Kitap
{
    public string Baslik { get; set; }
    public string Yazar { get; set; }
    public string ISBN { get; set; }
    public int SayfaSayisi { get; set; }
    public bool OduncVerildiMi { get; set; }
    
    public void BilgileriGoster()
    {
        Console.WriteLine($"📖 {Baslik}");
        Console.WriteLine($"   Yazar: {Yazar}");
        Console.WriteLine($"   ISBN: {ISBN}");
        Console.WriteLine($"   Sayfa: {SayfaSayisi}");
        Console.WriteLine($"   Durum: {(OduncVerildiMi ? "Ödünç verildi" : "Rafta")}");
    }
}

public class Uye
{
    public string Ad { get; set; }
    public string Soyad { get; set; }
    public string UyeNo { get; set; }
    public List<Kitap> OduncAlinanKitaplar { get; set; }
    
    public Uye()
    {
        OduncAlinanKitaplar = new List<Kitap>();
    }
    
    public bool KitapOduncAl(Kitap kitap)
    {
        if (!kitap.OduncVerildiMi)
        {
            kitap.OduncVerildiMi = true;
            OduncAlinanKitaplar.Add(kitap);
            Console.WriteLine($"✅ {Ad} {Soyad}, '{kitap.Baslik}' kitabını ödünç aldı.");
            return true;
        }
        Console.WriteLine($"❌ '{kitap.Baslik}' şu anda ödünç verilmiş durumda.");
        return false;
    }
    
    public void KitapIadeEt(Kitap kitap)
    {
        if (OduncAlinanKitaplar.Contains(kitap))
        {
            kitap.OduncVerildiMi = false;
            OduncAlinanKitaplar.Remove(kitap);
            Console.WriteLine($"📚 '{kitap.Baslik}' iade edildi.");
        }
    }
    
    public void OduncListesiniGoster()
    {
        Console.WriteLine($"\n{Ad} {Soyad}'ın ödünç aldığı kitaplar:");
        if (OduncAlinanKitaplar.Count == 0)
        {
            Console.WriteLine("   Ödünç alınan kitap yok.");
            return;
        }
        foreach (var kitap in OduncAlinanKitaplar)
        {
            Console.WriteLine($"   - {kitap.Baslik}");
        }
    }
}

Şimdi bu sınıfları kullanalım:

// Kitaplar oluştur
Kitap kitap1 = new Kitap
{
    Baslik = "Suç ve Ceza",
    Yazar = "Fyodor Dostoyevski",
    ISBN = "978-123-456",
    SayfaSayisi = 671
};

Kitap kitap2 = new Kitap
{
    Baslik = "1984",
    Yazar = "George Orwell",
    ISBN = "978-789-012",
    SayfaSayisi = 352
};

// Üyeler oluştur
Uye ahmet = new Uye
{
    Ad = "Ahmet",
    Soyad = "Yılmaz",
    UyeNo = "U001"
};

Uye elif = new Uye
{
    Ad = "Elif",
    Soyad = "Kaya",
    UyeNo = "U002"
};

// İşlemler
kitap1.BilgileriGoster();
Console.WriteLine();

ahmet.KitapOduncAl(kitap1);  // Ahmet ödünç alıyor
elif.KitapOduncAl(kitap1);   // Elif alamıyor - zaten ödünç verilmiş

elif.KitapOduncAl(kitap2);   // Elif başka kitap alıyor

ahmet.OduncListesiniGoster();
elif.OduncListesiniGoster();

ahmet.KitapIadeEt(kitap1);   // Ahmet iade ediyor
elif.KitapOduncAl(kitap1);   // Şimdi Elif alabilir

Object Initializer Syntax

C#'ta object oluştururken property'leri hızlıca atamak için güzel bir syntax var:

// Uzun yol
Kitap kitap1 = new Kitap();
kitap1.Baslik = "Suç ve Ceza";
kitap1.Yazar = "Dostoyevski";
kitap1.SayfaSayisi = 671;

// Object Initializer - Kısa ve temiz
Kitap kitap2 = new Kitap
{
    Baslik = "Suç ve Ceza",
    Yazar = "Dostoyevski",
    SayfaSayisi = 671
};

// Tek satırda bile yazılabilir (küçük objeler için)
Kitap kitap3 = new Kitap { Baslik = "1984", Yazar = "Orwell" };

this Anahtar Kelimesi

this, "şu anki nesne" demek. Özellikle parametre isimleri property isimleriyle aynı olduğunda kullanışlı:

public class Oyuncu
{
    public string Ad { get; set; }
    public int Puan { get; set; }
    
    // Parametre adı property adıyla aynı
    public void BilgileriAta(string Ad, int Puan)
    {
        this.Ad = Ad;       // this.Ad = class'ın property'si
        this.Puan = Puan;   // Ad = parametre
    }
    
    // this ile method zincirleme (Fluent API)
    public Oyuncu AdBelirle(string ad)
    {
        this.Ad = ad;
        return this;  // Kendini döndür
    }
    
    public Oyuncu PuanBelirle(int puan)
    {
        this.Puan = puan;
        return this;
    }
}

// Fluent API kullanımı
Oyuncu oyuncu = new Oyuncu()
    .AdBelirle("Zeynep")
    .PuanBelirle(100);

Özet: Class vs Object

Class Object
Taslak, şablon Somut örnek
Bellekte yer kaplamaz Bellekte yer kaplar
Tanımlama Kullanım
Bir tane Sınırsız
Kek kalıbı Kek

Sonraki Adım: Constructor

Class ve Object kavramlarını anladık. Ama fark ettiyseniz, object oluşturduktan sonra tek tek property atamak zahmetli olabiliyor.

Bir sonraki yazıda Constructor (Yapıcı Metod) kavramını öğreneceğiz. Object oluşturulurken otomatik çalışan ve başlangıç değerlerini atayan bu özel metodu inceleyeceğiz.

O zamana kadar, bol bol class yazıp object oluşturun! Pratik en iyi öğretmen. 🚀


Bu yazı, C# ile OOP serisinin ikinci yazısıdır. Bir önceki yazıda OOP'ye giriş yaptık, bir sonraki yazıda Constructor konusunu ele alacağız.

Yorumlar