Ana içeriğe atla

( C#) Ders 5 - Nesneye Dayali Programlamaya Giris

Nesneye Dayali Programlama (Object Oriented Programming)
 

Bu dersimizde Object Oriented Programlamaya basliyoruz. Ilk olarak siniflari (class), nesneleri (object) ve bunlar hakkinda temel bilgileri ögrenecegiz. Ardindan diger derslerimizde yapicilar(constructor), erisim belirleyiciler(Access modifiers), özellikler (properties), method asiri yüklemesi (method overloading) ve static metotlar konularina geçecegiz.

Sinif Kavrami

Bir veri tipini modellemek için kullandigimiz yapilara sinif denir. Bir sinif, kapsüllenmis verileri bu veriler üzerinde islem yapacak metotlari ve bu verilere ait özellikleri içerebilir. Örnegin .Net Framework Class Library içinde bulunan String sinifini inceleyelim. Bu sinif karakterlerden olusan bir dizi barindirir, bu kisma data denir, barindirdigi data üzerinde islemler yapabilecegimiz ToLowerCase(), Trim(),SubString() v.b gibi metotlar içerir. Ayrica barindirdigi dataya ait özellikler içerir. Örn stringin uzunlugunu bulan Lenght özelligi gibi.
C# da bir sinifin tanimlanmasi basitçe asagidaki gibidir.
?
1
2
3
4
5
class YeniClass
{
    //sinif icinde verileri tutacak alanlar,
    //metotlar ve özellikler bu kisma yaziliyor
}

Nesneler(Object)

Siniflar bir veri modelidir, nesneler ise bu veri modeline bagli kalarak verileri tutan ve model içerisinde tanimlanmis metotlari ve özellikleri kullanmamizi saglayan modele ait bir referanstir.
?
1
YeniClass yeniNesne = new YeniClass()
Yukaridaki kod ile YeniClass sinifi türünde bir yeniNesne ismiyle bir nesne olusturmus olduk. Bu nesne ile sinifin içerdigi tüm modeli kullanabiliriz.

Nesneler referans tipi degiskenler grubuna girerler yani hafizada heap bölümünde olusturulurlar. Referans ve deger tipi degiskenlerine daha önceki derslerimizde deginmistik.

Fields

Fieldler sinif içerisinde veri barindiran alanlardir. ,Fieldler referans veya deger tiplerinden herhangi birisi olabilir, Örn baska bir sinifa referans gösteren nesnelerde bir sinif içerisinde field olarak kullanilabilir.

Bir ögrencinin bilgilerini ve notlarini tutan basit bir sinif yazalim.
?
1
2
3
4
5
6
7
8
9
10
class Ogrenci
{
    //sinifa ait fieldler
    string adSoyad;
    int yas;
    int numara;
    int matematikNotu = 0; //ilk deper verilmis..
    int ingilizceNotu;
    int dersOrtalama;
}
Yukaridaki kodda matematikkodu isimli degiskende oldugu gibi siniflara ait fieldlere tanimlama esnasinda deger atamasi yapabilirsiniz. Eger deger atamasi yapmazsaniz degiskenler default degerlerine set edilir. Degisken tiplerine göre default degerleri asagidaki tablodaki gibidir.
Veri TipiDefault Degeri
int0
long0
float0.0
double0.0
boolFALSE
char\0' (null karakteri
string"" (bos metin)
Objectnull

Metotlar

Metotlar, verileri kullanarak belirli islemler yapan yapilardir. Metotlar parametre olarak bazi degerler alabildigi gibi gerçeklestirdigi islem sonucunda bazi degerleri de geri döndürürler. Bir metodun yapisi asagidaki gibidir.
?
1
2
3
4
<dönüs degis. tipi><metodun ismi>(<parametre tipi> <parametre ismi>,..)
{
    //Metodun gerçeklestirecegi islemler için kod kismi
}
Örnek bir metot;
?
1
2
3
4
5
6
7
8
9
10
int ToplamBul(int sayi1, int sayi2)
{
    int toplam = sayi1 + sayi2;
    return toplam;
}
 
int MatematikNotunuDondur()
{
    return matematikNotu;
}
Yukaridaki örnekte iki sayiyi parametre olarak alan ve bunlari topladiktan sonra toplamlarini döndüren basit bir metot tanimladik. Metotlar dönüs islemlerini return kelimesi ile yaparlar. Eger tanimladigimiz metot bir dönüs degerine sahip degilse dönüs tipi olarak void yazmaliyiz. Dönüs tipi olarak belirledigimiz degisken tipi ile return ile döndürdügümüz degerin degisken tipi ayni olmak zorundadir.  Dönüs degeri olmayan ve herhangi bir parametre almayan basit bir örnek;
?
1
2
3
4
5
void TarihiYaz()
{
    Console.WriteLine("Suanki Tarih ve Saat : "
+ DateTime.Now.ToString("dd.MM.yyyy HH:mm"));
}

Nesne Olusturulmasi ve Nesneye Deger Atamasi

Bir sinifi referans gösterecek bir nesne olusturmak için new anahtar kelimesi kullanilir.
?
1
2
3
4
Ogrenci ogrenci = new Ogrenci();
//Ilk olarak nesneyi tanimlayip daha sonra olusturabilirsiniz..
Ogrenci ogrenci2;
ogrenci2 = new Ogrenci();
Yukaridaki örnekte 2. Yöntem ile tanimlama yaparken Ogrenci ogrenci2; kod parçacigi Ogrenci tipinde bir referans olusturur, fakat bu referans herhangi bir nesne içermez. Bu yüzden bu referansin degeri nulldur. ogrenci2 = new Ogrenci();dedigimizde ise heap de bir nesne olusturulur ve referans degiskenimiz bu alana isaret eder.

Bir Sinifin Üyelerine Erismek

Bir sinifin üyelerine (field, metot veya properties gibi) erismek için sinifa ait nesneden sonra nokta operatörünü kullaniriz.
?
1
2
3
4
5
6
Ogrenci ogrenci = new Ogrenci();
ogrenci.adSoyad = "Mehmet Sabri KUNT";
ogrenci.yas = 27;
ogrenci.matematikNotu = 89;
ogrenci.ToplamBul(13, 43);
int matnot = ogrenci.MatematikNotunuDondur();

Erisim Belirleyiciler ve Erisilebilirlilik Seviyeleri

Bir sinifa ait üyeler için erisilebilirlilik konusu önemlidir. Peki, Erisilebilirlilik ne demektir? Erisim belirleyiciler kullanarak bir üyenin güvenligini saglamis oluruz. Eger bir üyeye sinifimiz içindeki metotlar disinda herhangi bir erisim yapilmasini istemiyorsak veya projemiz disinda herhangi bir yerden bu üyeye erisim izni vermek istemiyorsak erisim belirleyicileri kullanmak zorundayiz.

Peki, erisimi engellemenin mantigi ne? Bir web servis yazdik ve bu web servisimiz içinde tanimladigimiz bir sinif var. Bu sinifa ait bir üyenin sadece web servis içinde tanimlanmis ve ya web servis projesi içinde tanimlanmis üyeler tarafindan erisilmesini istiyoruz. Web servisi kullanan insanlarin bu üyeye ait degerleri set etmesi veya get etmesi isimize gelmiyorsa, bu üyenin erisilebilirliligini kisitlamamiz gerekir. C# da kullanabilecegimiz toplam 5 farkli erisim seviyesi bulunuyor. Bunlari liste halinde asagida verdim.
Erisim BelirleyiciAçiklama
privateErisim seviyesi private olarak ayarlanan üyelere sadece bu üyenin bulundugu sinif içerisinden erisilebilir.
internalSadece üyenin bulundugu proje içerisinden erisilebilir.
protectedSadece üyenin bulundugu sinif ve bu siniftan türemis alt siniflardan erisilebilir.
protected internalSadece üyenin bulundugu proje içerisinden ayrica üyenin sinifindan türemis alt siniflar tarafindan erisilebilir.
publicpublic üyelerin erisiminde herhangi bir kisitlama yapilmaz. Istenilen her yerden üyeye erisim açiktir.
Object Oriented programlamada tüm sinif fieldlerinin private yapilmasi ve bu fieldlere erisimin metotlar ve/veya Özellikler(properties) üzerinden saglanmasi tavsiye edilir. Bu sayede fieldlerimize disaridan verilecek degerler kontrol edilebilir. Aksi takdirde disaridan fielde verilecek degerleri kontrol etmemiz imkânsizdir.

Üye tanimlarken eger bir erisim belirleyici kullanmazsak C# default olarak üyemizin erisim seviyesini private yapacaktir.

Namespaceler hariç tüm veri tipleri için erisim belirleyici kullanabilirsiniz. Fakat üst seviye tipler için (sinif, struct, enum) için sadece public ve internal erisim seviyelerini kullanabilirsiniz.

Özellikler(Properties)

Eger siniftaki tüm fieldlerin erisim seviyelerini private yaparsak o zaman bu fieldlere nasil erisebiliriz diye düsünmüssünüzdür. Cevap tabi ki, properties kullanarak. C# properties özelligini destekleyen ilk programlama dilidir. Java ve C++ gibi dillerde private bir fielde deger atamam veya bu fieldin degerini almak için public tanimlanmis metotlar kullanilir. Private bir field tanimlayalim ve bu fielde erisimi metotlar ve properties ler üzerinden nasil yapacagimiza bakalim.

Metot kullanarak:

?
1
2
3
4
5
6
7
8
9
10
private int dersNotu;
public void SetDersNotu(int not)
{
    dersNotu = not;
}
 
public int GetDersNotu()
{
    return dersNotu;
}

Properties kullanarak

?
1
2
3
4
5
6
private int dersNotu;
public int DersNotu
{
    get { return dersNotu; }
    set { dersNotu = value; }
}
Yukaridaki kodlari incelerseniz properties kullanarak private olan bir fielde erismenin ne kadar kolay oldugunu görürsünüz. Ayrica Visual Studio bir field için properties tanimlamayi otomatiklestiriyor. Bunun için kodunuzdaki fieldi sag tiklayin açilan menüden Refactor->Encapsulate Field menüsünü seçin, yukaridaki get ve set metotlari sizin için otomatik olarak olusturulacaktir. Properties içinde set veya get metotlarinda en az birini tanimlamaniz gerekiyor. Eger fieldinizin sadece readonly olmasini istiyorsaniz set özelligini silerek bunu yapabilirsiniz.

Eger tanimladiginiz field alaninin sadece belirli bir aralikta deger almasi gerekiyorsa, ‘örnegin ders notu 0 ile 100 arasi olmaz zorunda’ set metodu içine bu kontrolü asagidaki gibi ekleyebilirsiniz. Böylece dersNotu isimli fieldinizin alabilecegi degerleri kontrol etmis olursunuz. Bu kontrolü yapabilmek için fieldinize ait erisim seviyesini private yapmali ve asagidaki gibi bir properties kullanmaniz gerekiyor. Sanirim bu kontrol ile bir fielde ait erisim seviyesinin neden private yapilmasi gerektigini anlamissinizdir.
?
1
2
3
4
5
6
7
8
9
10
private int dersNotu;
public int DersNotu
{
    get { return dersNotu; }
    set
    {
        if (dersNotu >= 0 && dersNotu <= 100)
            dersNotu = value;
    }
}
Basit bir örnekle yukarida anlattiklarimiz pekistirelim.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
namespace OOPOrnek
{
   class Program
    {
        static void Main(string[] args)
        {
            Dortgen dortgen = new Dortgen();
            dortgen.KisaKenarUzunlugu = 200;
            dortgen.UzunKenarUzunlugu = 200;
            Console.WriteLine("Kenar Uzunluklari = {0}x{1}",
              dortgen.KisaKenarUzunlugu, dortgen.UzunKenarUzunlugu);
            Console.WriteLine("Dörtgen Tipi : {0}", dortgen.DortgenTipi);
        }
    }
    class Dortgen
    {
        private int kisaKenarUzunlugu;
        private int uzunKenarUzunlugu;
        public int KisaKenarUzunlugu
        {
            get { return kisaKenarUzunlugu; }
            set { kisaKenarUzunlugu = value; }
        }
      
        public int UzunKenarUzunlugu
        {
            get { return uzunKenarUzunlugu; }
            set { uzunKenarUzunlugu = value; }
        }
 
        public string DortgenTipi
        {
            get
            {
                string tip = "";
                if (kisaKenarUzunlugu == uzunKenarUzunlugu)
                    tip = "Kare";
                else
                    tip = "Dikdörtgen";
                return tip;
           }
        }
    }
}
Yukaridaki kodu inceleyecek olursak, basit bir sinif tanimladik. Sinifimiz basit bir dörtgen yapisini barindiriyor. Tabi ki bu sinifi daha detayli hale getirebiliriz. Ilerleyen derslerimizde bu sinifa yeni ilaveler yapacagiz.  Yeni bir console uygulamasi açip yukaridaki kodu Program.cs dosyasinin içine yapistirirsaniz sorunsuz çalisir. Çalistirdiginiz zaman asagidaki çiktiyi elde edeceksiniz.
Kenar Uzunluklari = 200x200
Dörtgen Tipi : Kare
Devam etmek için bir tusa basin . . .

Siniflarin Static Üyeleri

Bir sinida ait üyeye erisebilmek için o sinifa referans eden bir nesne olusturmaniz gerekir. Bu kural static üyeler için geçerli degildir. Yani yukaridaki örnegimizde Dörtgen sinifinda ürettigimiz bir dortgen nesnesini kullanarak kisaKenarUzunlugu üyesine erisebiliriz. Eger sinifimiza ait bir üye varsa ve bu üye bu siniftan türüyen tüm nesnelerde ayi degere sahip olacaksa static metod tanimlamak mantiklidir. Yukaridaki sinifimiza basit bir static üye ekleyelim  ve main fonksiyonu içinden çagiralim.
?
1
2
3
4
5
6
7
8
9
10
11
12
class Dortgen
    {
        public static int kenarAcisi = 90;
    
    
    }
 
 
static void Main(string[] args)
{   
     Console.WriteLine(Dortgen.kenarAcisi);
}
Yukarida gördügünz gibi Dortgen sinifinin adini yazdiktan sonra direk olarak static üyemizin ismini yazarak kullandik.  Static üye tanimlarken dikkat etmeniz gereken nokta sudur. Eger bir methodu static tanimladiysaniz, bu metot içinde sinifin üyelerinden static olmayan bir üye kullanamazsiniz. Tersi durumda yani static olmayan bir üye içinde static bir üye kullaniminda ise herhangi bir sorun yoktur.
?
1
An object reference is required for the non-static field, method, or property
Yukaridaki gibi bir hata aldiysaniz static bir metor içinde static olmayan bir metot kullanmaya çalisiyorsunuz demektir.

Yorumlar

Bu blogdaki popüler yayınlar

Linux En Az Sistem Gereksinimi İsteyen Dağıtımları Değerlendirilmesi

Linux İşletim Sisteminin Dağıtımlarının En az sistem gereksinimi isteyen sürümleri, değerlendirilmesi aşağıdadır, Değerlendirilen dağıtımlar şunlardır: Ubuntu Xubuntu Lubuntu Damn Small Linux Linux Mint Fedora Opensuse Debian Rat Hat Suse Linux Suse Linux Sistem Gereksinimleri: Pentium 1-4 ya da Xeon; AMD Duron, Athlon (XP, MP ya da 64), Sempron ya da Opteron 256MB RAM 500MB boş disk alanı 800x600 yada üstü resolution Rat Hat Memory Gerekli: 4 GB of memory Önerilen: 8 GB of memory CPU Gerekli: Intel Core processor, 2.4GHz, 512K cache or equivalent Önerilen: Intel multi-core processor, 2.4GHz dual processor, 512K cache or equivalent Storage 5 GB alan temel kurulum için. 40 GB alan Channel başına. 10 GB alan Cache dizini için(/var/cache/rhn) Disk yapılandırması olarak Raid 5 tavsiye edilir. Database İlk kurulum için 12 GB alan önerilir. Client ve channel hesaplamaları ise, 250 KB alan client system başına, 500 KB alan çhannel başına, ayrıca 230 KB channel da

( C#) Ders 4 - Diziler, Çok Boyutlu Diziler, Düzenli ve Düzensiz Çok Boyutlu Diziler Nasil Kullanilir. foreach Döngüsünün Kullanimi.

C# da Diziler Diziler için ayni tipteki verilerin tutuldugu bir koleksiyon diyebiliriz. Örnegin integer verinin bir yigin seklinde tutulmasi için dizileri kullaniriz. C# da diziler referans tipinde degiskenlerdendir. C# da tanimlanan tüm diziler System.Array sinifindan türemis bir nesnedir. C# da diziler asagidaki gibi tanimlanir. ? 1 <veri tipi>[] <degisken ismi> = new <veri tipi>[<dizinin boyutu>]; 10 adet integer veri tutan bir dizinin tanim ise ? 1 int [] integerDizi = new int [10]; Bir dizinin boyutlari sabittir ve kullanilmadan önce belirlenmelidir. Dizi boyutunu belirlemek için baska bir degiskende kullanabilirsiniz. ? 1 2 int boyut = 10; int [] integerDizi = new int [boyut]; Diziyi tanimlama ve baslangiç degerlerini atama islemini ayri satirlardada yapabilirsiniz. ? 1 2 int [] integerDizi; integerDizi = new int [10]; Ayrica dizileri tanimlarken, dizi içine atmak istedigin

JavaScript ile Popup Pencereleri

Popup pencereleri bir sayfa içinde ek bir pencere açma islemidir. Popup pencereler JavaScript kullanarak açilirlar. Popup pencereler yaygin olarak reklam göstermek amaciyla kullanilir. Diger bir kullanim amaci ise yardim sayfalari tasarlamak içindir. Ihtiyaciniz dogrultusunda farkli amaçlar için kullanilabilirler. Popup pencereler; Sayfa yüklenmesinde,Sayfadan çikildiginda,Kullanici bir linki tikladiginda açilabilir. Sayfa yüklenirken veya kapatilirken bir popup açmak için body etiketi içine asagidaki kodu yazmaniz yeterlidir. Sayfa yüklenirken ? 1 <body onload= "javascript: alert(Load islemi!')" > Sayfa Kapatilirken ? 1 <body onunload= "javascript: alert('UnLoad islemi!')" Link tiklandiginda ? 1 <a href= "javascript: alert('link Tiklandi!')" >Popup Aç!</a> Popup olarak yeni bir pencere açmak istiyorsak window.open() metodunu kullaniriz. Window.open metodun