Bu makele için Bilgehan YILDIZ' a teşekkürler
1-)Erişim Seviyeleri:
Baktığın zaman genelde bir fonksiyon,bir değişken vs erişim düzeyini belirleyebilirsin
Dört işlem diye bir class oluşturalım ve aşağıdaki fonksiyonları içine tanımlayalım
Kod:
public class DortIslem
{
public int IkiSayiTopla(int a, int b)
{
return a + b;
}
private int UcSayiTopla(int a, int b, int c)
{
return a + b+c;
}
protected int UcSayiCarp(int a, int b, int c)
{
return a * b * c;
}
}
Bu fonksiyonları bir formda çağırmak istediğim zaman sadece public olan IkiSayiTopla fonksiyonuna erişebildim.Diğer iki fonksiyonu formdan çağıramadım
Aşağıdaki resimde bu erişim belirteçlerinin tam tanımlarını bulabilirsin
Eğer bir şeye her yerden erişilecekse public
Sadece o sınıf veya formadan erişilicekse private kullanıyosun.En çok bu iki belirteç kullanılır
2-)Class
Field: Fieldler sınıf içerisinde veri barındıran alanlardır
Kod:
class Person
{
public int ID;
public string Ad;
public string Soyad;
public int Yas;
}
Metotlar: verileri kullanarak belirli işlemler yapan yapılardır
Properties:C# da fieldların encapsulation ile dışarıya açılmasıdır.Nesneye dayalı programlamaya göre fieldslar public olmamalıdır.Ancak propertyler yardımı ile dışarıdan erişilebilmelidir
Encapsulation
Bir nesnenin bazı özellik ve işlevlerini diğerlerinden saklanabilmesi, erişimin sınırlandırılabilmesidir. Yani private tanımladığımız field'ları kullanıcıdan saklamamız anlamına gelir ki zaten kullanıcının bunu kullanmasına gerek yoktur ve hatta kullanmaması gerekmektedir.Örnek olarak sen bilgisayarda sadece klavyenin tuşlarına basarken arkada daha pek çok parça sen dokunamadan çalışmaktadır.
Encapsulation iki önemli amacı vardır
1-)Arka plan kodlarını gizleme
2-)Fieldlara tam erişimi engelleme
Örnek olarak Person isimli sınıfımızı tekrar ele alalım ve yukarıdaki yazdıklarımıza göre tekrar revize edelim
Encapsulation yapılacak fieldları _FieldAdı şeklinde yazmak kullanılan bir notasyon biçimidir
private int _ID;
private string _Ad;
private string _Soyad;
private int _Yas;
Daha sonra aşağıdaki resimdeki gibi Fieldın üstüne gelerek Encapsule edebiliyoruz.
Yukarıdaki işlemi yaptıktan sonra propertimiz oluşur.Tabi istersen elle de yazabilirsin
Get ile propertyden değer okuma set ile bu değere yazma işlemi yapılır
Kod:
public int ID
{
get { return _ID; }
set { _ID = value; }
}
Birazdan işe nesneye dayalı programlamadan bakalım.Bizim person classımızın db de bir tablo karşılığı olsun ve burada ID otomatik artan bir sayı olsun.Bu durumda biz ID mizin sadece okunabilir olmasını istiyoruz,yazılabilir değil.Yapılacak tek şey propertyinin setini silmek olacaktır
Kod:
public int ID
{
get { return _ID; }
}
Küçük bi detay: prop yazıp taba çift tıklayarak property template çıkartabiliyoruz.Benzer mantıktağı foreach falan yazıp taba basarakta kullanabilirsin
public static int MyProperty{get; set;}
3-)Static kavramı
Baktığın zaman Esasında hep sınıflardan yeni birer instance üreterek çalışıyoruz.Ancak bazı durumlarda bu tarz türetme istenmez
Yani sen Class1 a=new Class1()
Dediğinde artık Class1 den bir a örneği oluşturarak bunun üstünde çalışıyorsun.Madde birdeki dört işlem classına aşağıdaki gibi static bir fonksiyon ekleyelim
Kod:
public static int Bolme(int a,int b)
{
return a/b;
}
Dikkat etceğin gibi static kullanmadan oluşturduğum fonksiyonları new ile Classın instance üretek kullanırken,static olarak tanımladığın fonksiyonu Direkt Classtan sonra nokta diyip kullanıyorum
4-)Inheritance(Kalıtım):Kalıtım object oriented programın en önemli özelliklerinden biridir.Kalıtım ile nesneler birbirinden türetilir.Türetilen sınıf türediği sınıfın tüm özelliklerini alır.
2 örnekte bir person Classı yaratmıştık.Şimdi ben istiyorum ki bir öğrenci Classı olsun bunun içindede ÖğrenciNo,HangiOkuldanGeldiği gibi özellikler olsun.Kalıtım işlemi aşağıdaki gibi : kullanılarak yapılır
Kod:
class Ogrenci:Person
class Ogrenci:Person
{
private string _OgrenciNo;
public string OgrenciNo
{
get { return _OgrenciNo; }
set { _OgrenciNo = value; }
}
private string _HangiOkuldanGeldi;
public string HangiOkuldanGeldi
{
get { return _HangiOkuldanGeldi; }
set { _HangiOkuldanGeldi = value; }
}
}
Artık bir öğrenci nesnesi türettiğimde artık Person Classta olan özellikleride kendinde barındırıyor
Peki bunların hepsini tek sınıfta yapsaydık olur muydu?Evet olurdu ancak şimdi bide öğretmen sınıfımızın oldunu düşünelim.Öğretmendede SicilNo,MedeniDurum vs.. gibi bilgiler olsun
Kod:
class Ogretmen:Person
{
private string _SicilNo;
public string SicilNo
{
get { return _SicilNo; }
set { _SicilNo = value; }
}
private string _MedeniDurum;
public string MedeniDurum
{
get { return _MedeniDurum; }
set { _MedeniDurum = value; }
}
}
Burdada gördüğün gibi öğretmende person özelliklerini aldı ve üstünede kendi özellikleri geldi
Ben burda nesneye dayalı mantığında şunu yapmış oldum.Bir temel sınıfta öğrencide olsa öğretmende olsa sonucta Adı,Soyadı ,Yası olacak sonucta insan ama SicilNo sadece öğretmende,öğrenci no sadece öğrencide.Bu şekilde hem daha az kod yazmış oldum,hemde nesne tabanlı bir model oluşturmuş oldum.
5-)Polimorfizm: oluşturduğumuz nesnelerin gerektiğinde başka bir nesneymiş gibi davranabilmesine polimorfizm denilmektedir.Yani aşağıdaki gibi Person nesnesi ile başladığımız p yi öğretmen olarak oluşturuyoruz.Ama p de öğretmene aşt Sicilno gibi özellikler gelmiyor.
Person p = new Ogretmen();
6-)Override ve Virtual
Bir class ta yazdığımız bir fonksiyon gerekirse türediği sınıfta geliştirilerek kullanabilmeliyiz.Bunun için ana sınıfta metodun başına virtual anahtar kelimesi gelirken bir üst sınıfta bu metod override anahtar sözcüğü ile değiştirebilir
Mesela DortIslem Classımıza aşağıdaki şekilde bir virtual fonksiyon tanımlayalım
public virtual int Toplama(int a, int b)
{
return a + b;
}
Daha sonra DortIslemden tureyen HesapMakinası isimli yeni bir sınıf yapalım.Override anahtar sözcüğünü kullandığımızda bir alt sınıfta virtual olarak verilen metodlar listelenir
Daha sonra form arkasında aşağıdaki gibi hesap makinasını oluşturup metodu çağırırsak bize çıktı olarak 9 verecektir.
HesapMakinasi hp = new HesapMakinasi();
int a=hp.Toplama(3, 5);
MessageBox.Show(a.ToString());