Nesne tabanlı programlama (Object Oriented Programming – OOP) kavramında kullanılan sınıf ve nesne kavramları, birbiriyle yakında ilişkilidir ve her şey bu iki olgu üzerine kurulmuştur.
Her bir nesne (object), bir sınıftan (class) türetilerek oluşturulmuştur. Sınıflar aracılığıyla yazılımlarımız daha modüler hale gelir. Yazılım güncelleme işlemleri daha kolay gerçekleştirilebilir ve aynı proje üzerinde birçok kişinin ortak çalışma ortamı daha kolay sağlanabilir.
“Nesneler Sınıflardan Türetilir”
Sınıf ile nesne arasındaki en net ilişki şu şekilde ortaya konmaktadır: “Nesneler sınıflardan türetilir.” Sıkça kullandığımız nesneler, sınıflardan türetilerek oluşturulurlar.
1 | Sınıf nesne = new Sınıf(); |
Yukarıdaki kullanım, sıkça karşılaştığımız yapıya benziyor. Bazı durumlarda sınıflara, daha nesne oluşturulurken parametre gönderilmesi gerekebilir. Bu durumda nesne oluştururken aşağıdaki şekilde bir kullanım gerçekleştirilir:
1 | Sınıf nesne = new Sınıf("yeni"); |
Yukarıdaki kullanımda nesne oluşturulurken sınıfın kurucu metoduna “yeni” içerikli string bir değer gönderildi. Bu değeri karşılayabilen örnek sınıf şu şekildedir:
1 2 3 4 5 6 7 | class Sınıf { public Sınıf(string veri) { ... } } |
Sınıflarda Kurucu Metotlar
Bir kurucu metot, sınıf adıyla aynı ada sahip, public olarak erişilebilir bir yapıdadır. Parametre alma zorunluluğu yoktur. Bir sınıfın birden fazla tipte kurucu metodu da olabilir, buna metot aşırı yüklemesi (method overloading) denir. Metot aşırı yüklemesi ile çok şekillilik (polymorphism) sağlanabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Sınıf { public Sınıf() { ... } public Sınıf(string veri) { ... } } |
Yukarıdaki şekilde tanımlı bir sınıftan iki şekilde nesne türetmek mümkündür:
1 | Sınıf nesne = new Sınıf(); |
veya
1 | Sınıf nesne = new Sınıf("yeni"); |
Dikkat edilirse, metot tanımlarken metodun döndüreceği int, string gibi tipler veya değer döndürmüyorsa void olarak kullanılan anahtar kelimeler kurucu metotlarda kullanılmaz. Bunnu sebebi kurucu metodun yalnızca nesne türetilirken kullanılabilmesidir, dolayısıyla değer döndürme veya döndürmeme gibi bir amaç taşımamaktadır.
Temel Sınıf Bileşenleri
Sınıflar değişken olarak kullanılan alanlar, özellikler ve metotlardan oluşabilir. (Terminolojinin aksine, alan (field) terimi yerine değişken terimi kullanılacaktır.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Sinif { int degisken; int Ozellik { get; set; } void Metot() { } } |
Yukarıda kurucu metodu olmayan bir sınıf örneği gösterilmiştir. Bu örnekte 3 temel yapı bulunmaktadır.
1. Değişkenler
Değişkenlerin sınıftaki görevleri yine aynı şekildedir: Değer tutmak… Değişkenlerin değer tutması dışında bu değeri kontrol edebilme veya mantıklı olup olmadığına karar verebilme yetiler yoktur. Kısacası kendi değer aralığı içinde olan her veriyi doğal olarak kabul eder ve taşıyabilir. Peki, int olarak tanımlı ve yaş tutan bir değişkene, 2 milyar gibi bir sayı girilmesi nasıl engellenir? Bunun için en kullanışlı yöntem, değişken gibi görünen ancak değişkene aktaracağımız içeriği kontrol edebildiğimiz özellikler kullanılabilir.
2. Özellikler (Properties)
Özellikler, değişkenlere çok benzerler. Tıpkı değişkenler gibi tipleri vardır. Ancak özellikten değer çekme veya değer aktarma gibi durumlarda bazı kısıtlamalar koyulabilir. Ayrıca özellikler değer tutamazlar, değişkenlere değer aktarır veya okurken kontrol mekanizması geliştirmemizi sağlarlar.
Değişken ve örnek arasındaki şu farka dikkat edilmelidir: Özellikler, get ve set blokları barındırabilir!
get bloğu ile bir özelliğin dışarıya aktardığı değerin kontrol edilmesi sağlanır. Eğer get bloğu yoksa, aşağıdaki bir kullanım mümkün olmayacaktır:
1 | textBox1.Text = nesne.Ozellik; |
Ozellik olarak tanımlanan özelliğin dışarıya değer aktarabilmesi için get { … } bloğunun varlığı zorunludur.
Benzer şekilde, bir özelliği değiştirmek, ancak ve ancak içinde set { … } bloğu varsa mümkün olmaktadır. Bu sayede şu şekilde bir kullanım mümkün hale gelir:
1 | nesne.Ozellik = textBox1.Text |
3. Metotlar (Methods)
Metotlar, prosedürel programlamada kullanılan fonksiyonlara verilen isimdir. Değer döndüren metotların isminin önüne döndüreceği değer tipi yazılır. Eğer değer döndürmeyecekse void anahtar kelimesi kullanılır. İstenirse metodlara parametre dediğimiz değişkenler ile gönderilen verinin karşılanması da mümkündür.
Aşağıda int tipinde değer döndürüp hiç parametre kabul etmeyen metot örneği verilmiştir:
1 2 3 4 | public int Metot() { ... } |
int tipinde değer döndürüp string tipinde parametre olarak veri kabul eden metot:
1 2 3 4 | public int Metot(string veri) { ... } |
Değer döndürmeden string ve int tiplerinde parametre olarak veri kabul eden metot:
1 2 3 4 | public void Metot(string veri1, int veri2) { ... } |
Değer döndürmeyen ve parametre kabul etmeyen metot:
1 2 3 4 | public void Metot() { ... } |
Metotlar hakkında daha kapsamlı kullanım detayları “Metot Nedir? C#’te Metotlar ve Çeşitleri” başlıklı yazıda mevcuttur.