C# programlama dilinde sınıflar ve nesneler, nesne yönelimli programlamanın (OOP) temel yapı taşlarıdır. Sınıflar, özellikler (properties) ve metotlar (methods) gibi öğeleri bir arada tutan bir şablon görevi görür. Erişim belirleyiciler (access modifiers), bu öğelerin erişim düzeylerini kontrol eder. Bu yazıda, sınıflar ve nesneler ile birlikte erişim belirleyicilerin detaylarına ve örneklerle kullanımına odaklanacağız.
1. Sınıf Nedir?
Sınıf, bir nesnenin yapısını tanımlayan bir şablondur. İçinde özellikler, metotlar, olaylar ve diğer üyeler bulunur.
Sınıf Tanımı
class SinifAdi
{
// Özellikler
public string OzellikAdi;
// Metotlar
public void MetotAdi()
{
Console.WriteLine("Bu bir metottur.");
}
}
Nesne (Object) Oluşturma
Sınıf bir şablon, nesne ise bu şablondan türetilen gerçek varlıktır.
SinifAdi nesne = new SinifAdi();
nesne.OzellikAdi = "Örnek Değer";
nesne.MetotAdi();
2. Erişim Belirleyiciler (Access Modifiers)
Erişim belirleyiciler, sınıflar, metotlar ve özelliklerin hangi sınıflar veya nesneler tarafından erişilebileceğini belirler. C#’ta kullanılan erişim belirleyiciler şunlardır:
a. public
(Genel Erişim)
- Üye, tüm sınıflardan erişilebilir.
public class Ornek
{
public string Ad = "C# Eğitimi";
}
Ornek o = new Ornek();
Console.WriteLine(o.Ad); // Çıktı: C# Eğitimi
b. private
(Özel Erişim)
- Üye, yalnızca tanımlandığı sınıf içinde erişilebilir.
class Ornek
{
private int Yas = 25;
public void Yazdir()
{
Console.WriteLine(Yas); // Sınıf içinden erişilebilir.
}
}
Ornek o = new Ornek();
// Console.WriteLine(o.Yas); // Hata: 'Yas' private olduğu için erişilemez.
c. protected
(Korumalı Erişim)
- Üye, yalnızca tanımlandığı sınıf ve ondan türeyen sınıflar tarafından erişilebilir.
class BaseClass
{
protected string Mesaj = "Korumalı Mesaj";
}
class DerivedClass : BaseClass
{
public void Goster()
{
Console.WriteLine(Mesaj); // Erişilebilir.
}
}
DerivedClass d = new DerivedClass();
d.Goster(); // Çıktı: Korumalı Mesaj
d. internal
(Dahili Erişim)
- Üye, yalnızca aynı projedeki sınıflardan erişilebilir.
internal class Ornek
{
internal string Ad = "C# Eğitimi";
}
Ornek o = new Ornek();
Console.WriteLine(o.Ad); // Aynı proje içinde erişilebilir.
e. protected internal
- Üye, aynı projedeki sınıflar veya türeyen sınıflar tarafından erişilebilir.
class BaseClass
{
protected internal string Mesaj = "Korumalı Dahili Mesaj";
}
class DerivedClass : BaseClass
{
public void Goster()
{
Console.WriteLine(Mesaj); // Erişilebilir.
}
}
DerivedClass d = new DerivedClass();
d.Goster(); // Çıktı: Korumalı Dahili Mesaj
f. private protected
- Üye, yalnızca aynı sınıf veya aynı sınıftan türeyen sınıflar içinde ve aynı projede erişilebilir.
class BaseClass
{
private protected string Mesaj = "Özel Korumalı Mesaj";
}
class DerivedClass : BaseClass
{
public void Goster()
{
Console.WriteLine(Mesaj); // Aynı sınıftan türeyen sınıflarda erişilebilir.
}
}
3. Örneklerle Erişim Belirleyiciler
Örnek: public
ve private
Kullanımı
class Araba
{
public string Model;
private int Yil;
public void YilBelirle(int yil)
{
if (yil > 2000)
Yil = yil;
else
Console.WriteLine("Geçersiz yıl.");
}
public void Yazdir()
{
Console.WriteLine($"Model: {Model}, Yıl: {Yil}");
}
}
Araba araba = new Araba();
araba.Model = "Toyota";
// araba.Yil = 1990; // Hata: Yil private olduğu için erişilemez.
araba.YilBelirle(2022);
araba.Yazdir(); // Çıktı: Model: Toyota, Yıl: 2022
Örnek: Kalıtımda protected
Kullanımı
class Hayvan
{
protected string Tur;
public void TurBelirle(string tur)
{
Tur = tur;
}
}
class Kopek : Hayvan
{
public void Yazdir()
{
Console.WriteLine($"Tür: {Tur}");
}
}
Kopek kopek = new Kopek();
kopek.TurBelirle("Köpek");
kopek.Yazdir(); // Çıktı: Tür: Köpek
4. Sınıflar ve Erişim Belirleyiciler ile İlgili İpuçları
- Kapsülleme (Encapsulation): Erişim belirleyicileri kullanarak, sınıflarınızda yalnızca gerektiği kadar bilgiyi dışa açın.
- Getter ve Setter: Özelliklerin erişim kontrolünü sağlamak için
get
veset
kullanılabilir.
class Kisi
{
private string isim;
public string Isim
{
get { return isim; }
set { isim = value; }
}
}
Kisi kisi = new Kisi();
kisi.Isim = "Ahmet";
Console.WriteLine(kisi.Isim); // Çıktı: Ahmet