You are on page 1of 59

ETM :

NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
Nesne Ynelimli
Programlamaya Giri

2 / 59



Nesne ynelimli programlama (Object Oriented Programming) bir bilgisayar programlama yaklamdr. Bu
yaklam, gnmzde ok sayda gncel programlama dili tarafndan desteklenir.
Nesne Ynelimli Programlama yaklam 1960'l yllarn sonuna doru ortaya kmtr. O dnemde
yazlm dnyasnda karlalan sorunlara zm olmas amacyla gelitirilmitir. Yazlmlarn kapsam, ierii ve
karmakl ile birlikte boyutlar da srekli art gsteriyordu. Bu art ile birlikte, yazlan kodu hzl bir ekilde
geliime ak ve esnek tutmak iin gereken bakm maliyeti, zaman ve aba ok daha hzl bir art sergiliyordu.
Nesne Ynelimli Programlama, bu soruna bir zm olarak geliti. zmdeki balca zellik, yazlmda
birimselliin (modularity) benimsenmi olmasdr. Nesne Ynelimli Programlama ayrca, kapslleme
(encapsulation), kaltm (inheritance) ve ok biimlilik (polymorphism) gibi yazlmn bakmn ve ayn yazlm
projesi zerinde ekip almasn kolaylatran kavramlar da yazlm dnyasna kazandrmtr. Salad bu
avantajlardan dolay, Nesne Ynelimli Programlama, gnmzde geni apl yazlm projelerinde yaygn bir
biimde tercih edilip kullanlmaktadr.
Nesne Ynelimli Programlama'da her bilgisayar programnn, etkileim ierisinde olan birimler veya
nesneler kmesinden olutuu varsaylr. Bu nesnelerin her biri, kendi ierisinde veri ileyip dier nesneler ile
ift ynl veri alveriinde bulunabilir. Nesne Ynelimli Programlama ncesinde -nesne tabanl prosedrel
programlama zamannda- programlar, sadece bir komut dizisi veya birer fonksiyon kmesi olarak
grlmekteydi.
Nesne tabanl programlama dilleri, nesne kullanmn desteklemelerine ramen, kaltm gibi nesne
ynelimli programlama dillerine zg zellikleri tamazlar. Nesne ynelimli programlama dillerine rnek olarak
ABAP/4, Simula, Smalltalk, C++, Object Pascal, Objective-C, Eiffel, Python, Java, C Sharp, Visual Basic.NET ve
REALbasic'i sayabiliriz. Nesne tabanl olup da nesne ynelimli olmayan programlama dili olarak da Visual Basic
iyi bir rnek tekil etmektedir. Visual Basic nesne ve snflar desteklese de, kaltmdan yoksundur.









































3 / 59







ETM :
NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
Nesne Ynelimli Dillerin
Tarihesi

4 / 59



Yeni bir programlama dili renilirken genellikle dilin sz dizimi, nasl deiken tanmlanaca, alma aknn
nasl kontrol edilecei vb. zelliklerine fazlasyla vakit ayrlr. Bunun yannda kaliteli kod yazmak iin dilin perde
arkasnda kulland metodoloji ve prensipleri de kavramaya ihtiya vardr. C#, tamamen nesne ynelimli bir
dildir. Bu yzden optimum dizayn edilmi uygulamalar oluturmak iin, dilin nesne ynelimli zelliklerinin iyi
kavranmas arttr.

Eer nesne ynelimli uygulama gelitirme modeline yeniysen, prosedrel diller zerinde tecrben olsa
dahi, eski bilgiler burada sana uygun bir altyap salamayacaktr. Nesne ynelimli programlama, problem
zmlerinin dizayn edilip programlanmas hakknda yeni bir dnce yoludur. Ayrca eer programlama
dnyasnda henz yeniysen, Basic, Cobol, C vb. prosedrel diller yerine nesne ynelimli bir dil ile balamann
renme srecini hzlandraca, yaplan aratrmalar sonucu ortaya kan bir gerektir. Bu kiiler, OOP renme
srecini gletirecek prosedrel dil alkanlklarndan kurtulmak zorunda kalmazlar. Programlama dnyasna
temiz bir yolda kp hzlca ilerlerler. Prosedrel dil gemii olup, nesne ynelimli programlamaya C# ile gei
yapan bir kii iin verilebilecek en gzel tavsiye; renme srecinde ak fikirli olup kendisini bu yeni dnyaya
adapte etmeye almas ve eski alkanlklar ile karlatrma yapmamasdr.

Nesne ynelimli bir dil ile programlama srecinin saysz faydas vardr. Daha efektif kod yazmak ve
kolayca modifiye edilebilecek bir sisteme sahip olmak bu faydalardan sadece bir kadr. Bu mimariyi anlamak
ve kullanmak ilk balarda kolay olmayabilir, hatta uzun sre alabilir; ancak bu srenin sonunda, nesne ynelimli
programlamann verdii szleri yerine getirdii (doru uygulandnda) grlecektir.

Programlamaya Prosedrel Yaklam

Problemlerin zlmesi iin programlar yazlr, uygulamalar gelitirilir. Programlamaya prosedrel
yaklamda bir problem kk paralara blnr ve her bir problem ayr ayr zlr. Daha sonra btn
problemi zmek iin bu kk zmler birletirilir.

Her bir kk problem, bir grev olarak ele alnr. Bu grevi gerekletirmek iin prosedr ad verilen
kod bloklar yazlr. Bir prosedr baka bir prosedrden eriilebilir. Prosedrler birletirilip bir program
oluturulabilir. Daha sonra btn programlar birbirlerine entegre edilip yazlm uygulamas ortaya kar.

Tipik bir prosedrel program bir satr kod ile balar. Ardndan kontrol deyimleri, operatrler, i
mantnn uygulanmas ile ilerlenir ve son satra gelindiinde program sonlanr.

Fortran, Pascal ve C, prosedrel yaklam esas alan programlama dillerinden bazlardr. Aada, bir
alann meslei tabanl prim hesaplamasn yapan szde kod (pseudocode) yer almaktadr.

Begin
character cAdi
character cMeslegi
numeric nPrim
Procedure PrimHesapla
begin
if cMeslegi = Mudur
begin
nPrim = 1000
end
if cMeslegi = Analist
begin
nPrim = 500
end
display nPrim
end
accept cAdi
accept cMeslegi
Call PrimHesapla

5 / 59



End

Burada veriler alann ad, meslei ve prim miktarlardr. PrimHesapla prosedr, alann primini
hesaplayan i mantn ierir, program satr satr alr ve prim miktar hesaplanr.


Prosedrel Programlama Yaklamnda Snrlamalar

Prosedrel programlama yaklamnda prosedrler, uygulama ierisinde bir defa yazlp istenilen
yerlerde arlrlar. Ancak bir uygulamaya ait prosedrler, baka bir uygulama tarafndan kullanlamazlar. nk
kod paralar birbirlerine baldr ve belirli bir seriyi takip ederler. rnein PrimHesapla() prosedr baka bir
uygulamada kullanlmak istenirse, ikinci uygulamada yeniden yazlmas gerekmektedir.

Prosedrel yaklam kullanlarak gelitirilen byk bir uygulama kolayca modifiye edilemez. Yazlan
btn kodlar birbirlerine sk sk baldr ve bir yerde yaplan deiikliin, uygulamann bir ok yerine etkilerini
ele almak gerekir. Oysa bir yazlm uygulamasnn dinamik ihtiyalara cevap verebilmesi, deiiklikleri sessizce
yanstabilmesi gerekmektedir. Prosedrel yaklamda bu tarz deiiklikler ykl miktarda yeniden kod yazmay
gerektirir. Bu durum ise uygulamann bakm maliyetini (hem zaman, hem ekonomik olarak) arttrr.

Programlamaya, prosedrel yaklamn getirdii yukarda bahsedilen snrlamalardan dolay, yazlm
gelitirme mhendisleri daha iyi bir yol aramaya balamlardr.


Nesne Ynelimli Dillerin Evrimi

Hemen hemen btn nesne tabanl ve nesne ynelimli dillerin atas, 1960larda gelitirilen Simula
dilidir. Simula, ALGOL
5
fikri zerine ina edilmi bir dildir; ancak zerine kapslleme (encapsulation) ve kaltm
(inheritance) konseptlerini eklemiir. Belki daha da nemlisi, karmak sistemleri tanmlama ve simlasyon
gelitirme dili olarak kullanlan Simulann, programlama dnyasn spesifik problem alanna zel kod yazma
disiplini ile tantrmasdr (Nesne taslaklarn hazrlayan kod kmelerinin yazlp daha sonra kullanlmas).

Ardndan Smalltalk dili ortaya kmtr. Simula, Smalltalk dilinin birincil esin kaynadr. Bu fikir
sonralar farkl gelitirmelerle desteklenmitir. Smalltalk hem bir dili, hem de bir uyguma gelitirme ortamn
temsil eder. Saf nesne ynelimli bir dil olan Smalltalk dilinde her ey bir nesne olarak ele alnr; integer bile bir
snftr. Smalltalk, gnmzde yaygn olmasa da kendisini takip eden btn nesne ynelimli diller onun
konseptinden etkilenmitir. Bu yzden nemli bir kilometre tadr.


Orijinal ad C with Classes olan C++ dili, Bjarne Stroustrup adl bir akademisyen tarafndan, doktora
tezinde uygulama gelitirirken karlat sorunlardan yola karak 1979da gelitirilmeye balanm, 1985de ilk
versiyonu yaynlanmtr. Bu yeni dilin gelitirilme aamasnda bata C ve Simula olmak zere ALGOL 68, Ada
gibi dillerden esinlenilmitir. Genellikle C dilinin daha gelimi hali olarak nitelendirilir (Tip kontrol, ar
yklenmi fonksiyonlar, statik fonksiyonlar, abstract snf, protected yeler gibi dil yenilikleri gelmitir). Ancak
en nemlisi C++, C diline nesne ynelimli programlama zelliini eklemitir. C++ dili, donanm seviyesinde
uygulama gelitirirken (iletim sistemi, src vb.) alt seviye bir dil olmas sebebiyle halen tercih edilmektedir.
Doksanl yllarn hemen banda Sun Microsystems alanlarndan James Gosling ve kk grubu elence
platformlar, mikrodalga frnlar vb. dijital olarak kontrol edilen tketici aletleri iin ileri seviye uygulamalar
gelitiriyorlard. Bu programlar C++ ile yazmak zor olduu iin 1991 ylnda OAK ad verilen bir dil oluturdular.
Gelitirme aamasnda OAK, genel amal bir programlama dili haline geldi ve 1995 ylnda ad deitirilerek
Java 1.0 srm ile duyuruldu. Write Once, Run Anywhere (Bir kez yaz, her yerde altr ) yani platform
bamsz uygulama gelitirmek hedefinde olan java dilinin esas hedefi, yaygnlaan internet eriimine ayak
uydurarak web uygulamalarnn kolayca gelitirilecei bir platform haline gelmekti. Java, gnmzde halen
yaygn olarak kullanlmaktadr. Bir programlama dilinden te Smalltalk gibi bir uygulama gelitirme ortam ve
alma zamandr. Java teknolojisi ile uygulama gelitirmek ve altrmak iin Java Virtual Machine kullanlmas

6 / 59



gereklidir ve derlenen kaynak kodlar, platform bamszlk hedefi iin Java Byte Code adnda ortak bir ara dile
dntrlmektedir. Ayrca Java platformu, zengin ve geniletilebilen bir kod ktphanesi iermektedir.

(5) ALGOL (ALGOrithmic Language), 1950lerin ortalarnda Fortran dilindeki problemleri gidermek iin dizayn
edilen bir dildir. Bunun yannda Algol, Pascal gibi baz dillerin ortaya kmasnda rol oynamtr. ALGOL keli
parantezli ifade bloklarn kullanr. Ayrca onlar snrlandrmak iin BEGIN END bloklarn kullanan ilk
programlama dilidir.






























































7 / 59







ETM :
ADO.NET








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
Veri ve Veriye Eriim
Teknolojileri

8 / 59



Veri ve Veriye Eriim Teknolojileri
Birok uygulama baz bilgileri geici olarak tutup, daha sonra o bilgileri kullanarak ilemler yapar.
Ancak bu bilgiler sadece uygulama alt srece eriilebilir durumdadr. nk; bellek, uygulama alrken
bilgileri geici olarak tutmak iin kullanlr. Bu ekilde alan uygulamalara hesap makinas rnek olarak
verilebilir. Yani kullancdan birka veri alp bunlar hemen ileyen ve bu bilgilerin daha sonra kullanlmas
gerekmedii iin geici olarak tutulmasnda saknca olmayan uygulamalardr.

Ancak her uygulama bu ekilde gelitirilemez. nk alnan bilgilere uygulama kapatldktan sonra da
eriilmesi gerekebilir. Bu durumda bilgileri bellek dnda, veriyi kalc olarak tutabilecek bir ortama, rnein;
disklere kaydetmek gerekecektir. te bu ihtiyac karlamak iin farkl yntemler gelitirilmi ve gnmzde ok
byk miktarlarda veri tutan sistemler tasarlanmtr.

Ksaca bu geliime bakacak olursak; ilk olarak, gnmzde de halen ok sk kullanlan veri
tutulabilecek belki de en basit yapsal olmayan sistemin text dosya olduu sylenebilir. Ancak, bu yaplar da
zamanla yetersiz kalm ve yapsal fakat hiyerarik olmayan zmler gelitirilmitir. Bu balk altnda Comma
Separated Value (CSV) dosyalar, Microsoft Exchange dosyalar, Active Directory dosyalar rnek olarak
verilebilir.

Zamanla, sadece veriyi tutmu olmak da yetersiz kalm ve verileri hiyerarik bir yapda tutma
gereksinimi domutur. Bu yapya da verilecek en gzel rnek XML teknolojisidir. Bu yapnn da yetersiz kald
durumlar iin ilikisel (Relational) veri depolama sistemleri gelitirilmitir. likisel veri depolama modeli
gnmzde youn olarak kullanlmaktadr. Bu modelle saklanan verileri ynetmek iin gelitirilen uygulamalara
da ilikisel veritaban ynetim sistemi (Relational Database Management System, RDBMS) ad verilmektedir.

Bylece veritabann (Database), veriyi daha sonra kullanlabilmesi ya da sadece depolanmas
amacyla belli bir formatta tutan sistem olarak aklayabiliriz.

Gnmzde byk miktarlardaki verileri depolamak iin ve bunlar ynetmek iin eitli firmalarn
gelitirmi olduu uygulamalar vardr. Bu uygulamalara rnek olarak Microsoft SQL Server, Oracle ve Microsoft
Access verilebilir.

imdi veriye eriim teknolojilerinden bahsedilmesi gerekmektedir. Peki nelerdir bu teknolojiler?

Veriye Eriim Teknolojileri

ODBC (Open Database Connectivity)

Microsoft ve dier kurulularn gelitirdii bu teknoloji ile birok veri kaynana balanarak, veri
alverii yaplabilmektedir. ODBC uygulama ortamlarna bir API sunmakta ve uygulamalarn farkl sistemlere
balanlabilmesini salamaktadr.

ODBC teknolojisi 1990 ncesi gelitirilmi olmasna ramen ADO.NET platformunda da yer alan bir
teknolojidir. ODBC hem yerel (local) hem de uzaktaki (Remote) veri kaynaklarna erimek iin kullanlabilecek
bir veri eriim teknolojisidir.



DAO (Data Access Objects)

9 / 59




DAO, ODBCnin aa seviye diller iin (C,C++) gelitirilmi olmas ve kullanmnn zor olmas
nedeniyle, Microsoft tarafndan Visual Basic 3 ile gelitirilmi ve kullanm ok kolay bir teknolojidir.
Microsoftun, Microsoft Access veritabanlarna eriim standard olan Jet iin gelitirdii bu model, halen
VB6dan MS Accesse eriim iin en hzl yntemdir.

RDO (Remote Data Objects)

Microsoftun Visual Basic 4 ile duyurduu RDO, DAOnun ODBC salaycsndaki eksikliini gidermek
iin gelitirilmitir. Uzak veri kaynaklarna eriimde ODBCnin daha performansl kullanlmasn salar.

OLE DB (Object Linking and Embedding DataBase)

ODBCde olduu gibi driver (src) mantyla alan OLE DB, arka tarafta COM arayzn kullanan
bir tekniktir. Kaydettii gelime ile bir ok sisteme balant iin kullanlabilmektedir. Bu baarsndan dolay da
ADO.NET ierisinde nemli bir yeri vardr.

ADO (ActiveX Data Objects)

ADO aslnda arka planda OLE DB teknolojisini kullanan ve veriye eriimi daha da kolaylatran, yksek
seviye programlama dilleri iin veri eriiminde tercih edilen bir teknolojidir.

ADO, ADO.NETe temel oluturduu sylenen bir teknoloji olmasna ramen bu tam olarak doru
deildir. Bunun en byk nedenlerinden birisi de ADOnun COM desteine gereksinim duymasdr. Gnmzde
baz platformlarda halen kullanlan bu teknoloji, XML standardna destek vermek iin eklentilerle
glendirilmesine ramen, XML formatndaki veriyi sadece tayabilmektedir. Aksine, ADO.NET, XML standard
zerine kurulmu ve veriyi tarken de XML formatn kulllanan bir teknoloji olarak gelitirilmitir.

ADO.NET

ADO.NET, Microsoftun .NET platformunda ok nemli bir yere sahip, .NET uygulamalarndan, her
trl veri kaynana eriim iin gerekli hazr tipleri olan, COM destei gerektirmeyen, XML standard zerine
kurulmu ve en nemlisi de .NET Frameworkn imkanlarn kullanabilen, ADOnun gelimi bir versiyonu
olmaktan ok, yeni bir teknoloji olarak karmza kmaktadr.

ADO.NET, .NET Framework n bir paras olarak 1.0dan itibaren, .NETin tm versiyonlarnda yer
almaktadr. Ayrca veri ilemlerini ok kolaylatran ve nesneye ynelik programlama (Object Oriented
Programming) modeline uygun yaps nedeniyle son derece kullanl bir platformdur.


10 / 59




Veri kaynaklar ve Uygulamalar arasndaki balant




















































11 / 59







ETM :
NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
Programlamada Nesne ve Snf
Kavramlar

12 / 59



Nesne

u ana kadar kavramsal olarak (ve gnlk yaamda) nesnenin ne olduu saptanmaya alld. imdi ise
daha kesin izgilerle bu konseptin programlama ortamnda nasl temsil edilecei tartlacaktr.

Programatik anlamda nesne, nesne ynelimli programlamann yaptalarndan birisidir. Nesne
ynelimli programlama yaklamnda tm eler birer nesne olarak grlrler. Aadaki eler, nesneye birer
rnek olarak dnlebilir:

Araba
Bebek
Kedi
Metinsel Bir fade
Yemek
Kamera

Nesne, bir varlk ya da konsepti programatik olarak aklayan soyut ifadedir. Nesneler ayrca, zellikleri
ve davranlar hakknda da bilgi barndrrlar. C# dilinde aadaki kod kullanlarak bir nesne rneklemesi
yaplabilir. Nesne rneklenmesi, nesnenin program ierisinde bilgisayar hafzasna alnmasn ifade etmektedir.

Baby b = new Baby();
Hafzaya yeni bir nesne karan kod
Nesneye ait tip bilgisi
Hafzadaki nesneyi iaret edecek deiken ad

rneimizdeki bebek nesnesinin zelliklerini dndmzde, ad, soyad, boyu, arl, doum tarihi
gibi her bebein kendine zg zellikleri olduunu syleyebiliriz. Nesnelerin zellikler dnda bir de
davranlara sahip olduunu sylemitik; bu davranlar nesnenin darya uygulad ya da dardan nesneye
uygulanan ilevsellikler olabilir. rnek vermek gerekir ise; bebek nesnemiz, ackr, alar, uyur, emekler, beslenir.

Eer daha nce Windows zerinde programlama yaptysanz; windows formu zerine yerletirilen
metin kutusu (TextBox), liste kutusu (ListBox), buton (Button) vb. saysz kontrollerin de birer nesne olduunu
biliyorsunuz. Microsoft gelitiricileri, bu kontrolleri biz uygulama gelitiricilerin kullanabilmeleri iin
yazmlardr. Bir gelitirici bu kontrollerin belli ileri yapabildiini bilir. rnein; ekranda yaz gstermek iin Text
zelliine, metin kutusunun boyutlandrlmas iin Width zelliine bilgi girii yaplabilir.

Snf

Programalama yaparken snf ve nesne kavramlarnn birbirinden ayrt edilmesi gerekir. Snf, bir
nesnenin tanmdr; davranlarn yanstan karakteristiklerin ve nesnede olmas gereken zelliklerin neler
olduunu belirleyen bir ablondur. rnein mimarn izdii kat plan, mhendis ve iilerin gerek hayata
aktaracaklar bina iin bir taslaktr. Binaya klacak toplam 10 kat iin ortada tek bir tasarm vardr. Bu
tasarmda belirtilen zelliklerin hepsi her katta yer almak zorundadr; ancak zelliklerin deerlerinin
deiebilecei unutulmamaldr. Mimar her katta 1 daire ve her dairede 4 oda olacan belirtmesine ramen
katlardaki bu 4 odann metrekareleri ya da her dairenin pencere boyu birbirinden farkl olabilir. Burada mimarn
izimi snf; ii ve mhendislerin gerek hayatta meydana getirdikleri (maddesel olarak yer kaplayan her kat)
nesne olarak programlama ortamna aktarlabilir. Programlama ortamnda snf bellekte yer kaplamaz, sadece
bir kod tasarmdr. Nesneler ise snfta belirtilen zelliklere ve davranlara sahip bellekte yer kaplayan
rneklerdir (instance). alma zamannda oluturulurlar.

Snf yeleri

Nesnelerin iki yz vardr: D dnya tarafndan bilinen ne yapt, ve genellikle darya kapal olan
nasl yapt. Nesnenin ne yapar ksm (ilevsellii), metotlar ile temsil edilir. Metotlar, gelitirici iin bir
fonsiyonellii temsil eden kod bloudur. Nasl alr ksm ise, metotlar ve nesnenin zelliklerini salayan

13 / 59



deikenler ile temsil edilir. Bu deikenler C# terminolojisinde alan (field) olarak tanmlanmaktadrlar. Bu
bilgilerden yola karak bir genelleme yaplrsa nesne tasla olan snf, metotlar ve alanlar ile tanmlanrlar.

Ayrca ye terimi, bir snfa ait olan herhangi bir para iin kullanlr. Bunlar bir alan ve bir metot
olabilecei gibi ilerleyen konularda grlecek olan dier programlama eleri de olabilir.

C# snf yelerinden bazlar aada liste olarak yer almaktadr:

Field (alan)
Property (zellik)
Method (metot)
Event (olay)























































14 / 59







ETM :
NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
C# Snf Tipini Anlamak

15 / 59



Basit anlamda bir snf, alan (field) ve metotlardan oluan kullanc tanml bir veri tipinden baka bir ey
deildir. Bir snfn alanlar ortaklaa bir snf nesne rneinin durumunu (state) temsil ederler. Bir baka deyile,
yazlan bir snfn nesneleri, alanlara verilecek farkl deerler ile farkllk kazanrlar.

Nesne ynelimli dillerin, veri ve fonksiyonellikleri tek bir kullanc tanml veri tipinde gruplayabilme
yetenei ve gc, gerek hayat varlklarnn yannda yazlm tiplerinin de modellenebilmelerini salar. rnein
futbol ya da basketbol oyunu yazarken oyuncu profillerine birok yerde ihtiya duyulabilir. Oyuncu adndaki
snf ile programn bu ihtiyacn karlayan veri tipini modellemeye altmz varsayalm. u anda programn
geri kalann dnmeyip bu snf yazmaya odaklanalm. Snf, her oyuncu iin ad, takm ve formaNo bilgilerini
saklayan bir yapda olsun. Ek olarak Oyuncu snf, bir oyuncunun takmnn deitirilmesini salayan
TakimDegistir metodu ve bir oyuncunun o anki durumu hakknda bilgi veren BilgiVer metodunu iersin.
Aadaki ekil, Oyuncu snfn gstermektedir.


Oyuncu snf (class) tipi

Oyuncu snf, nesne kullancsna baz yetkiler sunmaktadr. Bunlar, yeni bir oyuncunun ad, forma no,
oynad takm adn tutmak, oyuncunun takmn deitirmek ve oyuncu profili hakknda genel bilgi vermektir.
Snf yazmak iin gerekli C# kodu aadaki gibidir:

namespace SinifKullanimi
{
class Oyuncu
{
public string adi;
public string takimi;
public byte formaNo;

public string BilgiVer()
{
return string.Format("{0} {1} - {2}",formaNo,adi,takimi);
}
public void TakimDegistir(string yeniTakim)
{
takimi = yeniTakim;
}
}
}

Snfa ait btn kodlar, snf tanmlamasnn ardndan gelen ssl parantezler (curly brackets) arasnda
yer alr. Zorunluluk olmamasna ramen genellikle her snf kendisine ait bir dosyada tutulur. Bu, belli bir snfn
kodlar incelenmek istendiinde eriimi kolaylatrr; nk dosyaya verilen isim ou zaman snfn ismi olur.

Bir Snfn D Dnyaya Ak Arayzn Tanmlamak


16 / 59



Bir snfn isel durum verilerine ve fonksiyonelliklerine karar verdikten sonra sra snfn d dnyaya
ak arayzn ayrntlandrmaya gelir. Literatrde public interface terimi ile ifade edilen bu kavram,
oluturulan nesne deikeninin nokta operatr ile eriilebilen ye kmesini iaret eder. Snf ina eden
gelitirici -yazan- asndan d dnyaya ak arayz, snf ierisinde public eriim belirleyicisi ile tanmlanm
yelerdir.


Bir tipin d dnyaya ak arayznde i ie tip (nested types) tanmlamas yer alabilir.

Snf kullanan gelitirici ise nesne kullancs (object user) olarak nitelendirilir. Oyuncu snf, nesne
kullancs iin public eriim belirleyicisi ile iaretlenmi 3 tane alan (field) ve 2 tane metot iermektedir. Bu
rnekte yer alan Oyuncu snfnda btn yeler nesne kullancsna aktr; ancak bir snf ierisinde yardmc
yeler ya da deeri kontroll olarak d dnyaya almak istenen alanlar olabilir. Bu gibi senaryolar ilerleyen
blmlerde ilenecektir.

namespace SinifKullanimi
{
class Program
{
public static void Main(string[] args)
{
Oyuncu o1 = new Oyuncu();
o1.adi = "Emre";
o1.takimi = "Newcastle United";
o1.formaNo = 5;
Console.WriteLine(o1.BilgiVer());

Console.WriteLine("\n*****************************\n");

Oyuncu o2 = new Oyuncu();
o2.adi = "Thierry Henry";
o2.takimi = "Arsenal";
o2.formaNo = 14;
o2.TakimDegistir("Barcelona");
Console.WriteLine(o2.BilgiVer());

Console.ReadLine();
}
}
}

Programc tarafndan yeni bir snf tanmlandktan sonra, ayn framework ierisindeki nceden
tanmlanm olan snflar gibi kullanlabilir. Bir baka deyile yukardaki rnekte olduu gibi bu tipten yeni
deikenler oluturulabilir ya da aadaki rnekte olduu gibi tasarlanan snf tipinde parametre alan bir metot
yazlabilir.

namespace SinifKullanimi
{
class Program
{
public static void Main(string[] args)
{

}


17 / 59



public static void OyundanCikar(Oyuncu oyuncu)
{
//...
}
}
}

C# dilinde yeni bir nesne oluturulurken new anahtar kelimesi kullanlr.

namespace SinifKullanimi
{
class Program
{
public static void Main(string[] args)
{
//Hata!!! Balang deeri verilmemi lokal deiken! new kullanlmal.

MerhabaSinif s;
s.BirMetot();

//...
}
}

class MerhabaSinif
{
public void BirMetot()
{
//Kod blou
}
}
}

new anahtar kelimesi alma zamannda Oyuncu nesnesine bellek ayrlmas iin yol gstericilik yapar.
Belirtilen nesnenin bellekte kaplayaca byte miktarn hesaplar ve bellein heap blgesinden yeterli bellek alan
ayrlmasn salar. Aada, MerhabaSinif snf tipinde iki tane nesnenin nasl oluturulduu grlmektedir.

namespace SinifKullanimi
{
class MerhabaSinif
{
public void BirMetot()
{
//Kod blou
}
}

class Program
{
public static void Main(string[] args)
{
//Yeni bir nesne tek bir satrda tanmlanp oluturulabilir...
MerhabaSinif s1 = new MerhabaSinif();


18 / 59



//Yada referans tanmlamas ile nesne oluturulmas iki satra blnebilir. Bu genelde nesneye farkl
kod bloklar ierisinden eriilmek istendii durumlarda tercih edilir.
MerhabaSinif s2;
S2 = new MerhabaSinif();

//...
}
}
}

C#da referans trnden deikenler, bellekteki nesneler iin hafza adresi tutan gerek birer
referanstrlar. Nesnelerin heap blgesindeki adreslerini tutarlar ve kendileri stack blgesinde standart olarak 4
byte (64-Bit sistemlerde 8 byte) yer kaplarlar. Nesneye erimek isteyen bir nesne kullancs bu referanstan
faydalanr. Bu bilgiler nda s1 ve s2 deikenleri, bellein heap blgesinde MerhabaSinif tipinden alanlar
referans ederler.

Nesneler Bellekten Nasl Siliniyor?

Bellekte nesneye yer amak iin yaplan bilinli tanmlamann aksine, bellek blgesini temizlemek iin
herhangi bir operatr yoktur. Bunun yerine, nesne artk herhangi bir referans tarafndan iaret edilmediinde
ya da uygulama kapatlmadan nce alma zaman, bellek blgesini sisteme iade eder. Otomatik bellek
temizliinden, alma zamannn entegre bir paras olan garbage collector sorumludur. Garbage collector,
bellein heap blgesindeki hangi nesnenin artk referans edilmediini takip eder, bu nesneyi bir listeye dahil
eder ve zaman geldiinde (bellee ihtiya duyulduunda) listeden temizlik yapar. Sonu olarak, referans tipleri
iin ayrlan bellek alannn sisteme iade edilmesi iin derleme zamannda belirlenen herhangi bir yer yoktur.
Deer tiplerinde ise deikenin tanmland kod blounun (en ite kalan ssl parantez blounun) sonuna
gelindiinde deiken, bellekten otomatik olarak dmektedir. Yani deer tipli bir deikenin, bellein stack
blgesinden ne zaman decei derleme zamannda yazlan kod bloklar ile belirlenir.


Belirtmekte fayda var ki snflar(class) ile yaplar(struct) arasnda kod yazm asndan kk
deiiklikler dnda fark yoktur. rnein yukarda yazlan Oyuncu snfnda class anahtar kelimesi
yerine struct kullanlabilir. Ancak bir ok yerde yap yerine snf tercih edilir. Bunun balca sebebi,
snflarn referans tipli, yaplarn deer tipli olmasdr.




























19 / 59







ETM :
NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
Nesne Ynelimli
Programlamann Faydalar

20 / 59



Nesne Ynelimli Programlamann faydalar nelerdir?
Nesne Ynelimli Programlamada bir problemin zm paralara ayrlarak ele alnabilir. Burada her bir
parann ayr bir snf olduu sylenebilir. Nesnelerin de snflar sayesinde yaratldklarn zaten biliyorsunuz.
Snflar ve nesneler, gerek hayat problemlerini bilgisayar ortamna tamada kolaylklar salar.
stediimiz hereyi nesne olarak tanmlayarak zerinde ilem yapabiliriz. Ayrca snflar, kodlarmzn dzenli bir
biimde durmasn da salar. Bu sayede program zerinde yaplacak olan deiiklikler iin zaman kayb olmaz.
Nesne Ynelimli Programlamann zelliklerinden birisi de bir defa kodladktan sonra, ayn ilemleri
tekrar tekrar kodlamamaktr. Yani ok sk kullanacamz bir ilevi her kullanmzda tekrar yazmak yerine o
ilevi bir snf haline getirerek yeri geldiinde snfn nesnesini ararak, ihtiya duyulan ilevi rahatlkla
kullanabiliriz. Bylelikle projede harcanacak toplam mesai de ksalm olur.
Nesne Ynelimli Programlamada bir programc kendi programnda kullanmak zere bir snf yazdnda,
bu snf baka programlarda da kullanabilmektedir. Bu zelliiyle farkl projelerde de mesai sresi ksalmakta ve
proje maliyetleri azalmaktadr.
Ksaca Nesne Ynelimli Programlamann byk apl projelerde kodlamay kolaylatrdn syleyebiliriz.
Yazlan kodlarn daha kolay gncellenebilir ve gelitirilebilir olmas da ayr bir avantajdr.


















































21 / 59







ETM :
NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
Alanlar (Instance Fields)

22 / 59



Nesnenin Durum Verileri : Alanlar (Instance Fields)

Nesne ynelimli dizaynn nemli amalarndan birisi, herhangi bir objeyi temsil eden btnl
salamak iin, verileri gruplamaktr. Bu blmde Oyuncu snfna eklenen veriler tartlacaktr. Bir snf
ierisinde veri saklayan deiken iin nesne ynelimli literatrde kullanlan terim, ye deiken (member
variable) terimidir. Bu C# iin de geerli bir isimlendirme iken daha doru olan, alan (field) terimidir. Alan,
kendisini ieren tip ile ilikilendirilmi, bir isimle eriilen bellek birimidir. Nesne alanlar, nesne ierisinde veri
depolamak iin snf dzeyinde tanmlanan deikenlerdir.


Nesne alanlar teriminin kullanlmasnn sebebi birka blm sonra grlecek olan ve
verinin saklanma yerleri konusunda nesne alanlar ile aralarnda temel farkllklar bulunan statik
alanlardr.


Alanlar Tanmlamak

Oyuncu snf, 3 tane alan iermektedir : adi, takimi ve formaNo

namespace SinifKullanimi
{
class Oyuncu
{
public string adi;
public string takimi;
public byte formaNo;

//...
}
}

Snf ierisinde tanmlanan bu alanlar ile, programn farkl yerlerinde ihtiya duyulacak her Oyuncu
nesne rnei iin temel baz veriler saklamak mmkn olmaktadr. Bu durumda alanlarn nne public eriim
belirleyicisi konulmaldr. Bir alann nndeki public, alann saklad verinin bu snf darsndan eriilebilir
olduunu iaret eder. Lokal deiken tanmlamalarnda olduu gibi bir alan tanmlamas da alann saklayaca
verinin tipini ierir.

Alanlarn Varsaylan Deerleri

Snf tipinin ye deikenleri yani alanlar, ilgili snftan bir nesne rnei oluturulduu anda otomatik
olarak uygun varsaylan deerleri alrlar. Alnan bu deerler, alann veri tipine bal olarak deiir:

bool tipi, false deer alr.
int, long vb. tam say tipleri 0 deer alrlar.
double vb. ondalkl say tipleri 0.0 deer alrlar.
string veri tipi null deer alr.
char veri tipi \0 deerini alr.
Referans tiplerinin tm null deer alrlar.

Aada bu kural ele alan kod paras yer almaktadr.

namespace SinifKullanimi
{
class Televizyon
{
public int ekran;

23 / 59



public string marka;
public bool lcdMi;
}
class Program
{
public static void Main()
{
Televizyon tv = new Televizyon();

//0 deerini almtr.
Console.WriteLine("tv.ekran : {0}", tv.ekran);
//bo (null) deer almtr.
Console.WriteLine("tv.marka : {0}", tv.marka);
//false deer almtr.
Console.WriteLine("tv.lcdMi : {0}", tv.lcdMi);
}
}
}


Alanlarn Varsaylan Deerleri


Varsaylan Deerler ve Lokal Deikenler

Bir tip yesi ierisinde tanmlanan lokal deiken iin ise senaryo olduka farkldr. Bir lokal deiken
tanmlandnda kullanlmas iin ncelikle ona bilinli olarak deer atamasnn yaplmas gerekir. Yani lokal
deikenlerde varsaylan deer atamas sz konusu deildir. rnein aadaki kod blou derleme zaman hatas
ile sonulanr.

//Hata!!! lokalInt isimli deikene, kullanlmadan nce balang deeri atanmal.
public static void Main()
{
int lokalInt;
Console.WriteLine(lokalInt);
}

Bu problemi zmenin yolu lokalInt isimli deikene balang deeri verilmesidir.

//Byle daha iyi; artk herkes mutlu.
public static void Main()
{
int lokalInt = 0;
Console.WriteLine(lokalInt);
}


Lokal deikenleri kullanmak iin balang deeri verilmesi zorunluluunun geerli olmad
tek bir istisna durum vardr: Eer lokal deiken bir metoda output parametresi olarak aktarlmak

24 / 59



zere kullanlrsa balang deer atamas yaplmasna gerek yoktur. nk zaten metot ierisinde
kendisine mutlaka bir deer atanmak zorundadr.

Nesne Alanlarna Erimek

Alanlara deer atamas yaplabilir ve ardndan alann tad veri elde edilebilir. Bir alan
tanmlandnda nnde static niteleyicisinin kullanlmam olmas, alann nesne alan olduunu gsterir. Yani
alan, ilgili snftan oluturulan her bir nesne iin, nesnenin kendisine ait zel paras olarak bellekte yerini alr. O
yzden bir nesne alanna sadece kendisini ieren snf nesne rnei zerinden eriilebilir. Dorudan snf ad
zerinden eriilemez. Bu da gsteriyor ki bir alanla alabilmek iin ncelikle nesne rneinin bellee karlm
olmas gerekir.

namespace SinifKullanimi
{
class Program
{
public static void Main(string[] args)
{
Oyuncu o1 = new Oyuncu();
o1.adi = "Emre";
o1.takimi = "Newcastle United";
o1.formaNo = 5;

FormaDegistir(o1 , 9);

Console.WriteLine("{0} {1}, {2}" , o1.formaNo , o1.adi , o1.takimi);

Console.ReadLine();
}

static void FormaDegistir(Oyuncu oyuncu,int yeniNo)
{
oyuncu.formaNo = yeniNo;
}
}
}


Nesne alanna erimek

Yukardaki kodda ncelikle bir Oyuncu nesnesi rneklenmektedir. Ardndan her bir alannn deeri
verilir, forma numarasnn deitirilmesi iin FormaDegistir() metodu arlr. Son olarak o1 referansnn iaret
ettii Oyuncu nesnesi ile ilikili olan her bir alann deeri ekranda gsterilir.
Grld gibi bir alana deeri verilmeden nce Oyuncu nesnesine ihtiya duyulmaktadr. Dolaysyla
alanlara deer atanrken ve deerlerine eriilirken o1 deikeni alan isimlerinin n eki gibi kullanlmaktadr.






25 / 59







ETM :
NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
Metotlar ve Yapc Metot
(Constructor)

26 / 59



Yapc Metotlarn Rol (Constructor)

Snf nesne rnekleri oluturulurken tanmlamann sonunda kullanlan metot parantezlerinin aslnda bir
anlam vardr: Snfa ait yapc metodu armak!

Oyuncu o1 = new Oyuncu();

C# gibi nesne ynelimli dillerin en byk avantajlarndan birisi, bir snf nesne rnei oluturulduu
anda otomatik olarak arlan zel bir metodun tanmlanabilmesidir. Bu metoda yapc metot (constructor) ad
verilir. Varsaylan yapc metot, nesne ierisinde bellee karlacak olan btn alanlarn doru varsaylan
deerleri almasn salar. (Bu btn yapc metotlar iin geerlidir) Peki nesne oluturulduu anda arlan
yapc metoda isim olarak ne verilir de derleyicinin bu ii otomatik olarak yapmas salanr? Bu konuda C++
dilinin tasarmcs Stroustrup takip edilmitir. C# dilinde kullanlan yapc metotlar, bulunduklar snfla ayn
isimdedir. Aada basit bir yapc metodu ile birlikte basit bir snf yer almaktadr:

namespace YapiciMetotKullanimi
{
class YapiciliSinif
{
public YapiciliSinif()
{
Console.WriteLine("Yapc metot alt...");
}
}

class Program
{
public static void Main(string[] args)
{
YapiciliSinif ctor = new YapiciliSinif();
}
}
}

Yukarda, ierisinde yapc metodu olan bir snf ve Main metodu ierisinde sadece bu snftan bir nesne
rneinin oluturulduu kodlar yer almaktadr. Yapc metotlarn nesne rneklendii anda almas bu kod
blounun ktsndan anlalabilir.


Yapc metotlar nesne rneklendii anda otomatik olarak alr

Yapc metot, geriye void dahil deer dndrmeyen, parametre alabilen zel bir eit metottur. Her
snf mutlaka en az bir adet yapc metoda sahip olmak zorundadr. Eer snf ierisine yukardaki gibi bilinli
olarak yazlmazsa, derleyici bizim iin varsaylan bir yapc metot retir. Derleyici tarafndan retilen varsaylan
yapc metodun parametresi olmaz ve ierisinde alanlarn varsaylan deerleri verilir, bunun dnda hibir ey
yoktur. Gelitirici olarak kendin yapc bir metot yazmak istediinde bunu kolaylkla gerekletirebilirsin. Geriye
deer dndrmeyen (yani herhangi bir geri dn tipi belirtilmeyen), public eriim belirleyicisi ile iaretlenmi
ve iinde bulunduu snf ile ayn isimde bir metot yazman yeterli olur. Metot ierisine, ilgili snftan bir nesne

27 / 59



olutuu anda almas istenen C# kodu yazlabilir. Snf ierisine bilinli olarak yazlmad durumlarda her
snfn varsaylan yapc metodu aadaki gibi oluturulmaktadr.

namespace YapiciMetotKullanimi
{
class Oyuncu
{

public Oyuncu()
{
//Snfa ait alanlarn varsaylan deerleri otomatik olarak verilir.
}

public string adi;
public string takimi;
public byte formaNo;

public string BilgiVer()
{
return string.Format("{0} {1} - {2}", formaNo, adi, takimi);
}

public void TakimDegistir(string yeniTakim)
{
takimi = yeniTakim;
}
}
}

Yapc Metotlar Ar Yklemek

Nesne kullancs nesne ile almaya baladnda (yani nesne rnei oluturulmasnn hemen
ardndan) genellikle ilk i snf ierisinde tanmlanm olan alanlarn deerlerinin verilmesidir. Oyuncu snf gibi
birok snf ile allrken bir tane nesne iin deeri gerekli baz alanlara atama yaplmadan o nesne ile
almann fazla bir anlam olmayabilir. Bu sebeple nesne referans zerinden ilgili deikenler arlr ve srayla
deerleri verilir. yleyse, daha nesne rnei oluturulurken bu alanlarn alaca deerlerin belli olmas yerinde
bir hareket olacaktr. Bu durumda nesne, alanlarnn varsaylan deerleri ile deil, allacak gerek deerleri ile
bellee kar. Snflar bu i iin, varsaylan yerine kendi yapc metotlarmzn yazlmas imkann sunarlar. Bu
ekilde nesne kullancsna nesneyi oluturma annda durum verilerine balang deerlerinin verilmesi iin
kolay bir yol sunulmu olur.

namespace YapiciMetotKullanimi
{
class Oyuncu
{
//Kendi yazdmz yapc metot, nesnenin durum verilerine kullancdan alnan parametre deerlerini
aktaryor
public Oyuncu(string ad, string takim,byte formaNumarasi)
{
adi = ad;
takimi = takim;
formaNo = formaNumarasi;
Console.WriteLine("Parametrik yapc metot alt");
}

//Varsaylan yapc metot

28 / 59



public Oyuncu()
{
Console.WriteLine("Varsaylan yapc metot arld...");
}

public string adi;
public string takimi;
public byte formaNo;

public string BilgiVer()
{
return string.Format("{0} {1} - {2}", formaNo, adi, takimi);
}
public void TakimDegistir(string yeniTakim)
{
takimi = yeniTakim;
}
}
}

Yukarda kendi yazdmz yapc metot ve yeniden tanmlanan varsaylan yapc metot ile dzenlenmi
Oyuncu snf yer almaktadr.
Bir snf ierisinde parametreli bir yapc metot tanmlandnda varsaylan yapc metot derleyici
tarafndan retilmez. nk alanlarn deerleri, yeni tanmlanan yapc metot ierisinde, snfn tasarlaycs
tarafndan verilmitir. Ancak alma zaman, nesne oluturulduu anda arlan zel yapc metodu yine de
takip eder. Bunun sebebi snf tasarlayan gelitiricinin yazd yapc metot ierisinde snfa ait btn alanlarn
balang deerlerini bir ekilde atamak zorunda olmamasdr, hatta istenirse alanlarla ilgili hi kod
yazlmayabilir. Kullancdan parametre olarak alnan ya da kod blou ierisinde gelitirici tarafndan deeri
verilen alanlarn dnda kalanlara varsaylan deerlerini atamak zel yapc metodun grevidir.
Parametrik yapc metodun yannda nesne kullancsna alanlarn deerleri verilmeden nesnenin
tanmlanmas imkan verilmek istenirse, varsaylan yapc metot bilinli olarak yazlmaldr. nk snf ierisine
yazlan parametrik metot, derleyici tarafndan retileni ezmektedir.
Son haliyle Oyuncu snfnn kullanm ve ekran kts aadaki gibidir:

namespace YapiciMetotKullanimi
{
class Program
{
public static void Main(string[] args)
{
//Varsaylan yapc metot (constructor) arlr.
Oyuncu o1 = new Oyuncu();
Console.WriteLine(o1.BilgiVer() + "\n");

//Parametreli yapc metot arlr.
Oyuncu o2 = new Oyuncu("Tuncay", "Middlesbrough", 9);
Console.WriteLine(o2.BilgiVer());

Console.ReadLine();
}
}
}


29 / 59




Parametrik yapc metot kullanm

Yapc metotlar ar yklenebilirler. Yani farkl parametre saylar ya da tipleri ile istenilen sayda
yazlabilirler. Bunun amac nesne kullancsna farkl alan kmeleri ierisinden ihtiya duyduklarnn deerlerini
vererek nesneyi oluturma esnekliini sunmaktr. Aada farkl parametre kombinasyonlar ile yapc metodu
defa ar yklenmi Oyuncu snf yer almaktadr :

namespace YapiciMetotKullanimi
{
class Oyuncu
{
public string adi;
public string takimi;
public byte formaNo;

public Oyuncu(string ad)
{
adi = ad;
}
public Oyuncu(string ad, string takim)
{
adi = ad;
takimi = takim;
}
public Oyuncu(string ad, string takim, byte formaNumarasi)
{
adi = ad;
takimi = takim;
formaNo = formaNumarasi;
}

public string BilgiVer()
{
return string.Format("{0} {1} - {2}", formaNo, adi, takimi);
}

public void TakimDegistir(string yeniTakim)
{
takimi = yeniTakim;
}
}
}










30 / 59







ETM :
NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
Alanlara Balang Deeri
Verme

31 / 59



Snf tipleri genellikle ok sayda alana sahip olurlar. Bir snfn birden fazla yapc metot ierebilmesinden yola
karak, her bir yapc metot tanmlamasnda, alanlar iin yazlacak ayn balang deerini atama kodu, rahatsz
edici olabilir. yenin varsaylan balang deerini almas istenmiyorsa, her bir yapc metot ierisinde alan
atamalarn gerekletirmek doru bir yaklamdr. rnein bir tam say verisinin yaamna her zaman 3 deeri
ile baladndan emin olunmak isteniyorsa, aadaki gibi bir tasarm yaplabilir:

namespace AlanBaslangicDegeri
{
//Kullanm tamam; ancak fazla kod var.
class Daire
{
public string semti;
public int odaSayisi;

public Daire()
{
odaSayisi = 3;
}

public Daire(string semti)
{
odaSayisi = 3;
this.semti = semti;
}

//...

}
}

Bu tasarma alternatif olarak, snfa private eriim belirleyicisine sahip yardmc bir metot yazlp, btn
yapc metotlar ierisinden arlmas dnlebilir. Bu ekilde tekrar edilen atama kodunun nne geilmi
olur. Ancak halen tasarmda gereksiz kod yer almaktadr:

namespace AlanBaslangicDegeri
{
class Daire
{
public string semti;
public int odaSayisi;

public Daire()
{
this.OdaSayisiBelirle();
}

public Daire(string semti)
{
this.OdaSayisiBelirle();
this.semti = semti;
}

private void OdaSayisiBelirle()
{
this.odaSayisi = 3;
}

32 / 59




//...

}
}

Her iki teknik de geerli olmakla beraber C#, bir alann snf ierisinde tanmland anda balang
deerinin atanmasna izin verir. Derleme zamannda bir alana balang deeri verilmek istendiinde bu
kullanmdan faydalanlabilir. Alann varsaylan deerini almasnn istenmedii ve dardan alnan balang
deeri iin atama kodunun her yapc metot ierisinde tekrar edilmesinin tercih edilmedii durumlarda bu
teknik kullanldr. Alann deeri deitirilmek istenirse, nesne oluturulduktan sonra bunun yaplmas
mmkndr.

namespace AlanBaslangicDegeri
{
class Daire
{
public string semti;
public int odaSayisi = 3;
Oda o = new Oda(50, Oda.OdaCesidi.Salon);
//...
}
class Oda
{
//Odann eidini saklamak iin tanmlanan i-ie tip
public enum OdaCesidi
{
Salon, ocukOdas, MisafirOdas, YatakOdas, OturmaOdas, almaOdas,
}

public int metrekare;
public OdaCesidi odaCesit;

public Oda(int m2, OdaCesidi odaCesidi)
{
this.metrekare = m2;
this.odacesit = odaCesidi;
}
}
}

Bir emlak program iin ihtiya duyulabilecek Daire snf ile alldn varsayalm. Bir dairenin hangi
semtte yer ald string tipinde bir alanla, evin ka odas olduu int tipte bir alanla, evdeki her bir oda ise Oda
tipinde bir alanla temsil edilsin. Daire snfnn tasarm incelendiinde odaSayisi ve o Oda nesnesinin balang
deerlerinin tanmlama annda verildii grlmektedir. semti alannn ise balang deeri verilmemi, deerinin
nesne kullancsndan ya da yazlabilecek bir yapc metot yardmyla alnmas uygun grlmtr.
Bu kod rneinde ayrca dikkat edilmesi gereken birka nokta vardr. Daire snfnda yer alan o alannn
ait olduu tip tasarm incelendiinde i-ie tip kullanld grlmektedir. Oda snf ierisinde sadece bu snfn
kullanm iin OdaCesidi isimli bir numaralandrc tipi tanmlanmaktadr. Oda snf yapc metodu, alan gibi
kendi yeleri ierisinde bu tipi kullandnda sadece kendi adyla eriebilir. Daire snf bu tipte bir parametre ile
alrken, tipi ieren snfla birlikte tam adn (Oda.OdaCesidi) yazmak durumundadr. Bunun sebebi daha nce
bahsedildii zere OdaCesidi tipinin d dnya tarafndan Oda snfn bir yesi olarak grlmesidir.



33 / 59




Yukardaki rnekte yapld gibi ye atamalar, her zaman yapc metot i mantndan nce alr.
Dolaysyla yapc metot ierisinde bir alana deer atamas yaplrsa nceki deer atmalar iptal
edilmi olur.



































































34 / 59







ETM :
NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
const ve readonly Veri
Tanmlamak

35 / 59



Sabit Veri Tanmlamak : const

Snf deikenlerinin (alanlar) nasl tanmlandn nceki blmlerde grdn. imdi, zerine yeniden
atama yaplamayan verilerin nasl tanmlanacan inceleyeceiz. C#, sabit bir veri saklayan deiken
tanmlamak iin const anahtar kelimesini sunmaktadr. Bu ekilde oluturulan deikenlerin deerleri sabittir ve
sonradan deitirilemez. Tanmland anda deeri atanmak zorunda olan sabit verilerin deeri deitirilmeye
alldnda derleme zaman hatas alnr. const anahtar kelimesi, hem lokal deiken (metot, zellik vb.
ierisinde tanmlanan deikenler) hem de nesne rnei dzeyinde (alanlar iin) kullanlabilir.

Sabit (constant) deiken deeri derleme zamannda belirtilmelidir. Bu yzden bir nesne referans
zerinden sabit alana atama yaplamaz; nk nesne referans zerinden yaplan atama alma zamannda ele
alnr. Sabit veriye yaplan atama ise derleme zamannda assembly ierisinde CIL koduna yazlr. const anahtar
kelimesinin rnek kullanm iin yazlan snf aadadr:

namespace SabitVeriKullanimi
{
class Sabit
{
//Bir sabite atanan deer, derleme zamannda bilinmelidir.
public const short birKilometreKacMetre = 1000;
public const float pi = 3.14f;
public const string baskent = "Ankara";
}
}

Btn sabit verilerin deerleri derleme zamannda bellidir. ildasm.exe yardmyla bu sabitler ve
deerlerinin assembly ierisine yazlm olduu grlebilir.


Sabit verilerin deerleri derleme zamannda belli olur ve CILe yazlr.

Sabit Veriyi Kullanmak

Dardaki bir tip tarafndan tanmlanan sabit bir veri referans edilmek istendiinde nne tipin ad
konulmaldr. Bu, sabit alanlarn bilinsiz olarak statik olmasndan ileri gelir. statik yelere eriirken nesne
referans zerinden deil yenin ait olduu tip zerinden ilem yaplr. Eer sabit ye, erien tipin ya da erien
yenin ierisinde ise sabitin nne tip ad verilmek zorunda deildir. Bu noktalar biraz daha netletirmek iin
aadaki kodu inceleyelim.

namespace SabitVeriKullanimi
{
partial class Program
{
const string sirketAdi = "Microsoft Corp.";

public static void Main(string[] args)
{
//Baka tip tarafndan tanmlanan sabitlere erimek
Console.WriteLine("Bakent : {0}",Sabit.baskent);
Console.WriteLine("Bir kilometre = {0} metre", Sabit.birKilometreKacMetre);
Console.WriteLine("Pi says : {0}", Sabit.pi);

36 / 59




//Bu snfa ait sabit bir yeye erimek
Console.WriteLine("irket : {0}",sirketAdi);

//Lokal bir sabit deikene erimek
const int lokalSabitDegisken = 23;
Console.WriteLine("Lokal sabit : {0}",lokalSabitDegisken);

Console.ReadLine();
}
}
}

Dikkat edilirse Program snfnn, Sabit isimli snf ierisinde yer alan sabit verilere eriirken ncesinde
tip adn kulland grlebilir. Ancak kendi snf kapsama alan ierisinde yer alan sirketAdi sabitine direkt
eriebilir. Ayrca Main() metodu ierisindeki lokalSabitDegisken adl lokal deikene tabii ki dorudan eriim
salanabilmektedir.

Bir snf ierisinde tanmlanan alanlar, bu snftan oluturulan n sayda nesnenin her biri ierisinde ayr
ayr yer tutarlarken; const anahtar kelimesi ile sabit olarak tanmlanm alanlar, nesnelerin yesi olmazlar. Daha
global olarak snfa ait bir ye olarak yaamlarn srdrrler. const ile iaretlenmi sabitlerin bu zellii, statik
olmalarndan kaynaklanr. Statik yeler, her bir nesnenin ye ailelerine deil, btn ailelerin tand tek bir
aileye dahil olurlar. Dahil olunan bu aileye btn nesneler eriebilir. Sabit alanlar da bu paralelde alrlar.


Salt Okunur Veri Tanmlamak : readonly

Daha nce bahsedildii gibi bir sabite atanan deerin derleme zamannda bilinmesi gerekir; zira bu
deer CIL ierisinde yerini almaktadr. yleyse balang deeri alma zamanna kadar bilinmeyen bir sabit veri
tanmlanmak istendiinde ne olacak? Bu senaryoyu ele almak iin egitimKodu isimli alan olan Egitim isimli bir
snf tanmlandn varsayalm. Ayrca bu tip, deerleri deimeyecek olan iki tane Egitim tipinden alana sahip
olsun. Eer bu alanlarn deerlerinin deimemesi iin const anahtar kelimesi kullanlrsa, derleme zaman
hatas alnr. Bunun sebebi bir nesnenin adresinin ancak alma zamannda belli olmasdr, derleme zamannda
elde edilemez.

namespace SaltOkunurVeriKullanmi
{
public class Egitim
{
//Nesenin adresi alma zamannda belirlendii
//iin 'const' anahtar kelimesi burada kullanlamaz!

//Hata!!!
public const Egitim cSharp = new Egitim(2124);

//Hata!!!
public const Egitim sql = new Egitim(2779);

public int egitimKodu;
public Egitim() { }
public Egitim(int egitimKodu)
{
this.egitimKodu = egitimKodu;
}
}

37 / 59



}

Salt okunur alanlarn deeri derleme zamannda bilinmez, ancak alma zamannda bir kere
atandktan sonra, tekrar deitirilemez. Salt okunur bir alan tanmlamak iin readonly anahtar kelimesini
kullanabilirsin.

namespace SaltOkunurVeriKullanmi
{
public class Egitim
{
public readonly Egitim cSharp = new Egitim(2124);
public readonly Egitim sql = new Egitim(2779);

public int egitimKodu;
public Egitim() { }
public Egitim(int egitimKodu)
{
this.egitimKodu = egitimKodu;
}
}
}

Bu ekilde bir gncellemenin ardndan artk derleme zaman hatas alnmaz. Ayn zamanda cSharp ve
sql alanlarnn deerlerinin nesne kullancs tarafndan deitirilemeyecei garanti altna alnm olur.

namespace SaltOkunurVeriKullanmi
{
partial class Program
{
public static void Main(string[] args)
{
//Hata!!! Salt okunur alanlara atama sadece yapc metot ierisinde ya da alann tanmland yerde
yaplmaktadr.
Egitim e = new Egitim();
e.cSharp = new Egitim(2125); //Hata
}
}
}

const ile iaretlenmi sabit verilerin aksine readonly sabitler, bilinsiz olarak statik deillerdir. Bu
yzden deerleri bir nesneden dierine deiebilir. Eer deimesi istenmiyorsa yani verinin snf dzeyinde
olmas gerekiyorsa static anahtar kelimesinin eklenmesi yeterlidir.
Salt okunur bir alana atama sadece iki yerde yaplabilir. Bunlardan birincisi alann tanmland yerdir.
kincisi ise yapc metot ierisinde yaplan atamadr. Bu durum salt okunur alan deerinin bir d kaynaktan elde
edilmesi gereken durumlarda faydal olur. Salt okunur bir alan numarasna sahip Egitmen adnda baka bir
snf olduunu varsayalm. Nesne kullancsnn salt okunur egitmenId alannn deerine yapc metot yardmyla
atama yapabildii aadaki kod blou ile grlebilir:

namespace SaltOkunurVeriKullanmi
{
public class Egitmen
{
public readonly string egitmenId;
public Egitmen(string egitmenId)

38 / 59



{
this.egitmenId = egitmenId;
}

public void EgitmenIdBelirle(string id)
{
//Hata!!! Salt okunur alanlara atama sadece yapc metot ierisinde ya da alann tanmland yerde
yaplmaktadr.
this.egitmenId = id;
}
}
}

egitmenId salt okunur olduu iin bu alana sadece tanmland anda ya da yapc metot ierisinde
atama yaplabilir. Eer metot vb. baka bir ye ierisinde deeri deitirilmeye allrsa derleyici buna izin
vermez.

namespace SaltOkunurVeriKullanmi
{
partial class Program
{
public static void Main(string[] args)
{
Egitmen t1 = new Egitmen("y1000");
Egitmen t2 = new Egitmen("y1001");

//Hata!!! Salt okunur alanlara atama sadece yapc metot ierisinde ya da alann tanmland yerde
yaplmaktadr.
t2.egitmenId = "y1002";
}
}
}

Yukardaki kod blounda, salt okunur bir alan deerinin nesneden nesneye deiebileceini
grebilirsin. Ayrca nesne kullancs, yapc metot ile egitmenId deerini verdikten sonra herhangi bir ekilde bu
alannn deerini deitiremez.


Salt okunur veriler lokal deikenler iin kullanlamaz, sadece snf ya da yap yesi olan alanlar iin
kullanlabilir.





















39 / 59







ETM :
NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
Public & Private & Internal
Eriim Belirleyicileri (Access
Modifiers)

40 / 59



Snf (class) ya da yap (struct) yelerinin (metotlar, alanlar, yapc metotlar vb.) eriim dzeyleri,
tanmlandklarnda belirtilmek zorundadr. Eer ye, bir eriim belirleyici anahtar kelimesi kullanlmadan
tanmlanrsa otomatik olarak private atamas yaplr. Aada, C# dilindeki baz eriim belirleyicileri ve
aklamalar grlmektedir.

private, bir yeyi sadece tanmland snf ierisinden eriilebilir olarak iaretler. Bu yeyi ieren
snftan oluturulan bir nesne rnei zerinden private yeler eriilemezlerdir. C# dilinde yazlan
btn yeler varsaylan olarak private eriim belirleyicisine sahiptir.

internal, ayn assembly ierisindeki herhangi bir tip tarafndan eriilebilir yeler tanmlar. Baka bir
*.dll ya da *.exe ierisindeki bir tip ve yeleri bu yeye eriemez.

public, bir yeyi herhangi bir nesne deikeni zerinden eriilebilir olarak iaretler (yeyi ieren
snftan treyen snfn nesnesi dahil). Ayrca hem yenin tanmland snf ierisinden hem
kendisinden treyen snf ierisinden bu ye arlp kullanlabilir. Farkl bir assembly zerinden de
bu yeye eriim mmkndr.


ye Eriim Dzeyi

Bilindii gibi public olarak tanmlanan yeler, bir nesne referans zerinden nokta operatr ile direkt
olarak eriilebilirler. private olarak tanmlanan yeler ise nesne referans zerinden eriilemezler. Bunun yerine
nesnenin fonksiyonelliklerine yardmc olmak iin tanmland snf ierisinden arlabilirler (rnein yardmc
metotlar). protected yeler, snf hiyerarisi yani kaltm sz konusu olduunda faydaldrlar. internal ya da
protected internal yeler ise .NET kod ktphaneleri (*.dll, *.exe gibi) ile alldnda kullanlrlar.
Bu anahtar kelimelerin anlamlarn biraz daha ortaya karmak iin rendiin eriim belirleyicilerini
kullanan Uzak adnda bir snf yazalm:

namespace UyeErisimDuzeyleri
{
//ye eriim seenekleri
class Uzak
{
//Her yerden eriilebilir.
public void PublicMethod() { }

//Sadece Uzak snf ierisinden eriilebilir.
private void PrivateMethod() { }

//Ayn assembly ierisinden eriilebilir.
internal void InternalMethod() { }

//C# 2.0'dan itibaren varsaylan eriim belirleyicisi : private
void BirMetot() { }
}
}

imdi de Uzak snfndan bir nesne rnei oluturalm ve nokta operatr ile nesne referans zerinden
btn metotlar aralm.





public static void Main(string[] args)

41 / 59



{
//Uzak veri tipinden bir nesne rnei oluturulur ve yeler arlr.
Uzak remote = new Uzak();

remote.PublicMethod();
remote.InternalMethod();
remote.PrivateMethod(); //Hata!!!
remote.BirMetot(); //Hata!!!
}

Eer bu program derlenirse private olarak iaretlenen yelerin nesne zerinden eriilemedikleri ve
hata alnd grlr.

Tip Eriim Dzeyi

Tipler (snf (class), yap (struct), numaralandrc (enumeration), temsilci (delegate), arayz (interface))
tasarlanrken eriim belirleyicisi alrlar. sim alan dzeyinde tasarlanan tipler, yelerin aksine sadece public ve
internal ile snrldr. public eriim belirleyicisine sahip bir tip oluturulduunda tipin ierisinde bulunduu
assembly ya da tipi kullanan baka bir assembly ierisinden bu tipe eriilecei garanti edilmi olur.

//Bu tip herhangi bir assembly ierisinden kullanlabilir
public class AcikSnif { }

internal eriim belirleyicisine sahip bir tip, sadece tanmland assembly ierisindeki dier tipler ve yeleri
tarafndan kullanlabilir. Yani ierisinde internal bir tip yer alan .NET kod ktphanesini referans edip kullanan
bir assembly, bu tipi gremez, dolaysyla nesne rnei oluturamaz.

C# 2.0dan itibaren bir tip iin varsaylan eriim belirleyicisi internal olduu iin bilinli olarak public
eriim dzeyi kullanlmazsa internal bir tip oluturulur.

//Bu snflar sadece tanmlandklar assembly ierisinde kullanlabilirler.
internal class YardimciSinif { }

//C#da tipler iin varsaylan eriim belirleyicisi : internal
class KontrolSinifi { }


C#da i ie tipler (nested types), isim alan dzeyinde deil bir snf ya da yap ierisinde
tanmlanan tipleri ifade etmek iin kullanlr. Bunlar tip olmasna ramen tanmlandklar snf ya da
yapnn yesi gibidirler ve dolaysyla i ie tipler iin btn eriim dzeyleri geerlidir.



















42 / 59







ETM :
NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
Kapslleme (Encapsulation)

43 / 59




Kapslleme (Encapsulation)

Nesne ynelimli programlamann ilk prensibi kapslleme (encapsulation) olarak adlandrlr. Bu zellik,
dilin, nesne kullancsndan gereksiz uygulama ayrntlarn saklayabilme yetenei olarak ifade edilir. rnek
olarak .Net Framework temel snf ktphanesi ierisinde yer alan, Open() ve Close() metotlarna sahip
SqlConnection snfn ele alalm.

//...

//SqlConnection, veritabanna yaplan balantnn detaylarn kapsllemektedir.
SqlConnection baglanti = new SqlConnection("server = London; database = AdventureWorks;
integrated security = true");

baglanti.Open();

//Veritabanndan veri ekilir.

baglanti.Close();

//...

SqlConnection snf, veritabanna alacak balantnn salanmas, yklenmesi, ynetimi, kapanmas
gibi isel detaylar kapsllemitir. Nesne kullancs kapsllemeyi sever; nk programlama grevlerini daha
kolay hale getirir. SqlConnection snfnda olduu gibi, nesnenin grevini yerine getirmesi iin arka tarafta
alan onlarca satr kodu dnmeye gerek yoktur. Tek yaplmas gereken nesne rneinin oluturulmas ve
uygun metotlarn arlmasdr.

Kapsllemenin dier bir ilevi ise veri korumadr. Kitapta buraya kadar kullanlan snflarn alanlar,
public eriim dzeyi ile d dnyaya ak braklmtr. Ancak doru olan, nesnelerin durum verilerini private
eriim belirleyicisi ile koruma altna almaktr. Bu yolla dardan alann deeri elde edilmek ya da deitirilmek
istendiinde bir kontrolden gemesi zorunlu olur.
Kapsllemeye neden ihtiya duyulduunu bir rnekle inceleyelim:

namespace KapsullemeyeNedenIhtiyacDuyulur
{
//ki adet nesne alanndan oluan Kitap snf
class Kitap
{
public string kitapAdi;
public double fiyat;
}
}

D dnyaya ak yani public eriim belirleyicisine sahip alanlarn sorunu, ait olduklar snfn i
mantklarn alglayabilme yeteneklerinin olmamasdr. Dolaysyla atanan deerin i mantna (business logic)
uygun olup olmadna dair herhangi bir kontroln snf ierisinde yaplabilmesi mmkn olmamaktadr. Nesne
kullancs genelde snf yazan kii olmakla birlikte, harici birisi de olabilir. Dolaysyla byle bir kontrol nesne
kullancs tarafnda yapmak akla gelse de, bu ok efektif bir yol olmaz. Bilindii gibi C# double deikeni,
maksimum yaklak 310 basamakl tam say ya da ondalkl bir deeri tayabilir. Bu yzden derleyici bir kitabn
fiyat iin aadaki atamann yaplmasna izin verir:



namespace KapsullemeyeNedenIhtiyacDuyulur

44 / 59



{
class Program
{
//lgin... Bir cd, 120 milyar ytl!!!
public static void Main(string[] args)
{
Kitap ktp = new Kitap();

ktp.kitapAdi = "Kzl Nehirler";
ktp.fiyat = 120000000000;
}
}
}

Yukardaki kullanmda 120 milyar deeri, double tipinin snrlar ierisinde kalsa da gerek hayatta bir
kitap fiyatnn bu rakamda olmas imkanszdr. Grld gibi public alanlar, veri onaylama kurallarna zorlamak
iin herhangi bir yol sunmamaktadr. Eer Kitap snf, bir kitap fiyatnn 0 ile 25 ytl olmas gerektiini belirten bir
i kuralna (business rule) sahip olsayd, veri nesneye aktarlrken bu kural ilerdi.

Snflarn durum verileri olarak anlan alanlar, private eriim belirleyicisi alarak d dnyaya kapatlabilir.
Balang deerleri ise, snf ierisinde tanmland yerde ya da yapc metot yardmyla verilebilir. Byle bir
kapslleme tercih edildiinde baz durumlarda alann deerinin dardan okunmas ve sadece isel olarak snf
yeleri tarafndan atanmas gerekebilir. Alternatif olarak durum verileri zerinde yaplacak deiiklikler de
darya almak istenebilir. Ancak deiiklikle birlikte gelen verinin kontrol edilerek istenmeyen durumlarn
nne geilmesi gereklilii ortadadr.

Kapslleme, durum verilerinin tutarll iin bir yol sunmaktadr. public alanlar tanmlamaktansa, alan
verilerini private olarak tanmlamak alkanlk haline getirilmelidir (Herhangi bir i kural olmasa da). Bu
durumda alanlar nesne kullancsna iki teknikle alabilir:

Snf ierisinde nesne ynelimli dier diller iin geleneksel yol olan Erien ve Deitiren (Accessor
and Mutator) metotlar tanmlamak.
Snf ierisinde bir zellik (property) tanmlamak.

Hangi teknik kullanlrsa kullanlsn iyi kapsllenmi bir snf, ham verisini (yani alanlarn) ve onu nasl
ynettiinin ayrntlarn d dnyann kem gzlerinden gizlemelidir. Bu yaklamn gzel ve faydal olan yan,
snf yazan kiinin, alan kodu bozmadan kapal kaplar ardnda metodun uygulann deitirmekte serbest
olmasdr (Bu yaplrken metodun imzasnn deimemesi gerekir).


Geleneksel yol izlenerek yaplan kapslleme iin kullanlan metotlara literatrde
Getter/Seter metotlar ad da verilmektedir.




Erien ve Deitiren (Getter and Setter) Metotlar Tanmlamak

Bu teknii UyeKontrol adnda bir snf ile ele alalm. Bu snf ierisinde kullanc ad ve ifre iin iki tane
alan ve bunlarn doruluunu ilgili veri kaynandan kontrol eden bir metot yer alsn. Burada sadece
kullaniciAdi alanna atanacak deerin kontrolne odaklanlaca iin snfn dier yeleri yazlmamtr.


namespace Kapsulleme
{

45 / 59



class UyeKontrol
{
private string _kullaniciAdi;
private string _sifre;

//Getter method
public string KullaniciAdiniIste()
{
return _kullaniciAdi;
}

//Setter method
public void KullaniciAdiniBelirle(string kullaniciAdi)
{
//illegal karakterleri kontrol et, harf olmayan bir karakter olmas durumunda deer atamas yapma
//Max. uzunluk ya da buyuk-kucuk harf kontrolleri de yaplabilir.
bool isOk = true;
for (int i = 0; i < kullaniciAdi.Length; i++)
{
if (!char.IsLetter(kullaniciAdi[i]))
{
isOk = false;
break;
}

}

if (isOk)
_kullaniciAdi = kullaniciAdi;
else
throw new ArgumentException("Kullanc ad ierisinde harf dnda baka karakter olamaz");
}

//Dier yeler

}
}

Bu geleneksel yolda alanlar private olarak iaretlenir. Nesne kullancs alann deerini grmek
istediinde geriye string veri tipinde deer dndren public olarak iaretlenmi KullaniciAdiniIste() metodunu
arr. Bu metot _kullancAdi alannda saklanan deeri geriye dndrr. Bu metodun ierisinde herhangi bir
kontrol kodu yoktur fakat istenirse yazlabilir. Nesneye ait alann deeri dardan deitirilmek istendiinde ise
direkt olarak deitirilmemesi iin KullaniciAdiniBelirle() metoduna yeni deer parametre olarak aktarlr. Bu
metot alana atamay hemen yapmaz, nce yeni deeri sistemin i kuralna gre kontrol eder. rnekte, bu i
kural, kullanc adnn ierisinde harf dnda herhangi bir karakter kullanlmamasdr. Parametre bu i kuraln
yerine getirebilirse, alana atama yaplr. Eer parametrenin ierisinde harf dnda bir karakter varsa sisteme bir
alma zaman hatas frlatlr. Bylece nesne, i kuraln ihlal eden bir veri ile almaya devam etmemi olur.
Aada nesne kullancsna ait kod yer almaktadr:





namespace Kapsulleme
{
class Program

46 / 59



{
public static void Main(string[] args)
{
try
{
UyeKontrol uye = new UyeKontrol();
uye.KullaniciAdiniBelirle("emrahuslu");
Console.WriteLine("ye adnz : {0}", uye.KullaniciAdiniIste());
}
catch (ArgumentException exc)
{
//Snf ierisinden alma zaman hatas frlatlrken gnderilen mesaj ekrana baslr.
Console.WriteLine(exc.Message);
}

Console.ReadLine();
}
}
}

zellik (Property) Tanmlamak

Geleneksel yolun aksine C#, kapslleme iin tip zelliklerini (type properties) tercih eder. Bir zellik;
alan, metot vb. yeler gibi snfa ait bir yedir ve alanlarda sakl olan veriye eriim sunan bir veri gibi davranr.
Nesne kullancs zellikleri kullanarak alandaki deere erimek ve atama yapmak iin iki ayr metot armak
yerine bunu sanki alann kendisi ile alyormu gibi tek bir ye ile gerekletirir. Bu durum zelliklerin
tanmlanmas srasnda iki ayr blok kullanarak salanr. Bunlardan get blou Erien (accessor) metodun yerini
tutarken, set blou Belirleyen (Mutator) metodun yerini tutar.

namespace Kapsulleme
{
class UyeKontrol
{
private string _kullaniciAdi;
private string _sifre;

public string Sifre
{
get { return _sifre; }
set { _sifre = value; }
}

public string KullaniciAdi
{
get
{
return _kullaniciAdi;
}

set
{
//Burada atama ncesi gerekli kontroller yaplr. Herey yolunda ise atama gerekletirilir.
_kullaniciAdi = value;
}
}

47 / 59




//Dier yeler

}

zellikler ele alndnda, temelde Erien/Belirleyen metotlarn alma mantndan farkl hibir ey
yoktur. Aradaki tek fark zelliklerin iki metot uygulamasn tek bir at altnda toplamasdr. zellikler, koruma
altna ald alan ile ayn veri tipinde olmak durumundadr. smi tamamen farkl olabilir; ancak genel kullanm,
alan isminin byk harfle balayan eklidir. Dardan eriilmesi gerektii iin, eriim belirleyicisi, public veya
duruma gre eriim salamaya imkan veren uygun bir belirleyici olmaldr.

erisindeki get blou, zellie eriilmeye alldnda otomatik olarak arlr. Bu durumda set blou
kesinlikle almaz. Eer nesne kullancs, zellii atama operatrn sol tarafnda alana yeni bir deer vermek
iin kullanrsa bu sefer otomatik olarak set blou alr; get blou almaz. set blounun geleneksel versiyonu
olan Belirleyen metotta, alana atanmak istenen deer metoda parametre olarak aktarlyordu ve bu parametre
metot ierisinde kontrol iin kullanlyordu. zelliklerde ise atama yapldnda nesne kullancsndan gelen
deer parametre olarak gelmez; bunun yerine atanan deer set blou ierisinde value olarak ele alnmaktadr.
value deeri nesne zerinden yaplan atamada eitliin sa tarafndaki deerdir. Veri tipi her zaman iin
zelliin veri tipi ile uyumlu olmaldr.


zellikler, tek balarna hem deer atamas hem de deere eriim imkan sunarlar.

Aada zelliklerin nesne kullancs tarafndan ele aln yer almaktadr.

namespace Kapsulleme
{
class Program
{
public static void Main(string[] args)
{
try
{
UyeKontrol uye = new UyeKontrol();
uye.KullaniciAdi = "emrahuslu";
Console.WriteLine("ye adnz : {0}", uye.KullaniciAdi);
}
catch (ArgumentException exc)
{
//Snf ierisinden alma zaman hatas frlatlrken gnderilen mesaj ekrana baslr.
Console.WriteLine(exc.Message);
}


48 / 59



Console.ReadLine();
}
}
}

Alana deer vermek iin bir metot armak yerine, programlamann doasna daha uygun olan atama
operatrnden faydalanmak, zelliklerin geleneksel yola gre avantajlarndan biri olarak saylabilir. Ayrca
saysal bir deer dndren erien metot zerinden atama ksa yollarn kullanmak mmkn deilken, bi zellik
zerinden rnein ++ operatr kullanlabilir.

UyeKontrol snfnn, KullaniciAdi zelliinin tam uygulanm ve yapc metot destei kazandrlm
versiyonunu yazalm. Bylece yapc metotlara alnan parametrelerin alanlara m yoksa zelliklere mi atanaca
konusuna da aklk getirelim.

namespace Kapsulleme
{
class UyeKontrol
{
private string _kullaniciAdi;
private string _sifre;

// _kullaniciAdi alan iin kodlanan zellik
public string KullaniciAdi
{
get
{
return _kullaniciAdi;
}

set
{
//illegal karakterleri kontrol et, harf olmayan bir karakter olmas durumunda deer atamas yapma
//Max. uzunluk ya da buyuk-kucuk harf kontrolleri de yaplbilir.
bool isOk = true;
for (int i = 0; i < value.Length; i++)
{
if (!char.IsLetter(value[i]))
{
isOk = false;
break;
}

}

if (isOk)
_kullaniciAdi = value;
else
throw new ArgumentException("Kullanc ad ierisinde harf dnda baka karakter olamaz");
}
}

// _sifre alan iin kodlanan zellik
public string Sifre
{
get { return _sifre; }
set { _sifre = value; }

49 / 59



}

//Yapc metottan alnan durum verileri, dorudan _alanlara deil, varsa kontrolden gemek zere
zelliklere ynlendirilir.
public UyeKontrol(string kullaniciAdi , string sifre)
{
this.KullaniciAdi = kullaniciAdi;
this.Sifre = sifre;
}
public UyeKontrol()
{

}
//Dier yeler
}
}

Kod ierisinde yer alan notlarda da belirtildii zere zelliklerin ierisine (genelde set blouna)
kodlanm olan i mantklarnn almas iin yapc metoda alnan parametrelerin alanlara aktarlabilmelerine
ramen zelliklere aktarlmalar daha efektif olur. Ancak yapc metot zerinden yaplan ilk atamada farkl bir i
mant uygulanmak istenebilir. Bu gibi durumlarda yapc metottan alnan deerler bu farkl i kuralndan
geirilerek dorudan alana atanr.


.NET Framework temel snf ktphanesi, geleneksel Erien/Belirleyen metotlar yerine tip
zelliklerini tercih eder. Bu yzden snf ktphanesi ile salkl bir ekilde etkileen programlar iin
kendi tiplerimizi yazarken zelliklerden faydalanmak doru bir davran olacaktr.
zelliklerin, bir alann deerini iaret edip, alana deer atamalar zorunlu deildir. Bir alan
olmadan da zelliklerden faydalanlabilir.


zelliklerin get/set Bloklarnn Eriim Dzeyini Kontrol Etmek

C# 2.0 ncesinde get ve set bloklarnn eriim dzeyleri ayr ayr belirlenemezdi. Her ikisi de, zelliin
tanmlamasnda belirtilen eriim dzeyine sahip olurdu.

//get ve set bloklarnn eriim dzeyi Sifre zelliinin eriim dzeyi olan public oldu.
public string Sifre
{
get { return _sifre; }
set { _sifre = value; }
}

Baz durumlarda get ve set bloklarnn eriim dzeylerin ayr ayr belirlemek faydal olabilmektedir.
Bunu yapmak iin get ya da set anahtar kelimelerine n ek olarak eriim belirleyicisi yazlabilir. Eriim
belirleyicisi belirtilmeyen blok, zelliin eriim dzeyine sahip olur.

//Nesne kullancs sadece Sifre zelliinin deerini grebilir. Ancak sadece bu snfn dier yeleri, deerini
deitirebilir.
public string Sifre
{
get { return _sifre; }
private set { _sifre = value; }
}


50 / 59



Bu durumda Sifre zelliinin set blou sadece iinde bulunduu snftan arlabilmekte; nesne rnei
zerinden arlamamaktadr. zelliklerin get ve set bloklarna koyulacak eriim belirleyicisi, zelliin eriim
dzeyinden daha kstlayc olmaldr. Bu yzden public eriim dzeyi bilinli olarak yazlamamaktadr.



































































51 / 59







ETM :
NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
Kaltm (Inheritance)

52 / 59



Kaltm (Inheritance)

Kapsllenmi, tek bana bir snf gelitirme tekniini rendikten sonra, imdi sra birbirleriyle ilikili
snf aileleri oluturmaya geldi. Nesne ynelimli programlamann ikinci prensibi olan kaltm (inheritance), dilin
varolan snf tanmlamalarnn zerine yeni bir snf tanmlamas ina edilmesine izin verme yeteneidir. Kaltm,
bir temel snfn (base class ya da parent class) zellik ve davranlarn, bir alt snfn miras alarak sanki kendi
yeleriymi gibi kullanmasdr.


Snflar aras iliki

Bu ekil, diagramdan u ekilde okunabilir : Mdr bir alandr, alan ise bir objectdir. Snflar
arasnda bu tarz bir iliki oluturulduu zaman, tipler arasnda bir ballk ina edilmi olur. Kaltm fikrinin
altnda yatan en basit fikir, yeni bir snfn baka snflarn fonksiyonelliklerine sahip olmas ve muhtemelen
geniletmesidir.

.NET dnyasnda her tip, eninde sonunda ortak bir temel snftan (base class) trer: System.Object.
Object snf, .NET ekosisteminde yer alan btn tipler tarafndan desteklenen yeler kmesini tanmlamaktadr.
Herhangi bir temel snf belirtmeden tanmlanan bir snf, Object snfndan tretilmi olur.

namespace Kalitim
{
//Otomatik olarak System.Object snfndan trer.
class Calisan
{

}
}

Eer yaplan kaltmn, dikkat ekmesi istenirse, treyen snftan (derived class) sonra koyulan iki nokta
st ste (:), bir tipin temel snfnn ne olduunun belirtilmesine izin verir:

namespace Kalitim
{
//Her iki kullanm da dorudur.
class Calisan : System.Object
{

}

//ya da

class Calisan : object
{

}
}

Object snf, nesne dzeyinde ve snf dzeyinde (statik) birok ye tanmlamaktadr.


53 / 59



Var olan bir tipe yeni fonksiyonellikler eklenmek istendiinde veya birbiriyle ilikili snflarn birok
ortak yesi bulunmas durumunda kaltma bavurulabilir. Kaltmn uyguland yerde, bir temel snftan
treyen snflar, btn temel snf yelerini miras alrlar. .NET Framework ierisinden rnek vermek gerekirse
System.Windows.Forms isimalan altnda yer alan Control snf, kendi yazacamz bir windows kontrolnn ve
yine ayn isimalan altnda yer alan Button, TextBox gibi var olan windows kontrollerinin temel snf olarak
kullanlmaktadr.

Kendi kaltm hiyararimizi kullanmak iin yle bir rnei ele alalm: Calisan adndaki bir snf, bir
irkette alan btn personel eitlerinin tasarlanmasnda temel snf (base class) olarak kullanlsn. Bu
rnekte, personel eitlerinden sadece Mudur ve SatisElemani ele alnacaktr. Btn personeller iin ortak
olacak yeler; personel sigorta no, personel ad ve maa olarak belirlenebilir. Mdr, bir personel iin
dnlen bu 3 yeye kaltm yoluyla sahip olurken, departmannn yapt kar miktar bilgisini bnyesinde
barndrarak, tasarlanan Calisan snfn geniletmi olacak. Benzer ekilde sat eleman ise yapt sat
miktarn tutuyor olacak.

namespace Kalitim
{
class Calisan
{
private int _sskNo;
private string _adi;
private double _maasi;

public int SskNo
{
get { return _sskNo; }
set { _sskNo = value; }
}

public string Adi
{
get { return _adi; }
set { _adi = value; }
}

public double Maasi
{
get { return _maasi; }
set { _maasi = value; }
}
}
}

C# dilinde bir snften tretmek, snf tanmlamasnda snf adnn ardndan gelen ikinokta st stenin
ardndan temel snf adnn yazlmas ile gerekleir.










namespace Kalitim

54 / 59



{
class Mudur : Calisan
{
//Bir mdr, departmann ne kadar kar yaptn bilmelidir.
private double _departmanKar;

public double DepartmanKar
{
get { return _departmanKar; }
set { _departmanKar = value; }
}
}

class SatisElemani : Calisan
{
//Bir sat eleman ne kadar sat yaptn bilmelidir.
private int _satisSayisi;

public int SatisSayisi
{
get { return _satisSayisi; }
set { _satisSayisi = value; }
}
}
}







Artk snflar arasnda bir iliki kurulmu oldu. Mudur ve SatisElemani snflar, otomatik olarak, Calisan
snfnn btn public ve protected yelerine miras yoluyla sahip oldular. imdi bir rnekle, treyen snflardan
nesne rnekleri oluturup, temel snf yelerine eriebildiklerini grelim:


Treyen snflar otomatik olarak temel snflarnn yelerine eriirler.


namespace Kalitim

55 / 59



{
//Bir treyen snf nesnesi oluturulup temel snf yelerine eriilir.
class Program
{
public static void Main(string[] args)
{
//Yeni bir Mudur nesnesi oluturulur.
Mudur cem = new Mudur();

//Calisan temel snfndan miras alnan yeler
cem.SskNo = 82194482;
cem.Adi = "Cem Suskun";
cem.Maasi = 1000;

//Mudur snf tarafndan tanmlanan yeler
cem.DepartmanKar = 115000;

Console.ReadLine();
}
}
}













































56 / 59







ETM :
NESNE YNELML
PROGRAMLAMA (OBJECT
ORIENTED
PROGRAMMING)








Blm :
Nesne Ynelimli
Programlamaya Giri
Konu :
ok Biimlilik (Polymorphism)

57 / 59



ok Biimlilik (Polymorphism)

Nesne ynelimli programlamann son prensibi ok biimlilik (polymorphism) olarak adlandrlr. ok
biimlilii incelemek iin Calisan temel snfna ZamYap adnda bir metot ekleyelim.

namespace CokBicimlilik
{
class Calisan
{
//Dier yeler

public void ZamYap(double zamMiktari)
{
//Atama, dorudan temel snftaki yeye yaplr.
_maasi += zamMiktari;
}
}
}

Bu ye public olarak tanmland iin hem mdrlere hem de sat elemanlarna zam yaplabilir!

namespace CokBicimlilik
{
class Program
{
public static void Main(string[] args)
{
//Her alana zam yaplsn.
Mudur mdr = new Mudur(82119944, "Tark Ali", 1000, 20000);
mdr.ZamYap(250);
Console.WriteLine("mdr.Maasi : {0}", mdr.Maasi);

SatisElemani sts = new SatisElemani(80332398, "Sena Sevim", 750, 220);
sts.ZamYap(150);
Console.WriteLine("sts.Maasi : {0}", sts.Maasi);

Console.ReadLine();
}
}
}

Bu tasarmdaki problem, treyenlerin kaltarak kulland ZamYap() metodunun uygulannn btn
treyenler iin benzer olmasdr. Yani Calisan snfnda yer alan ZamYap() metodunun uygulan hem Mudur
hem de SatisElemani iin ayndr. Halbuki pozisyona ve performansa gre zam stratejisinin belirlenmesi daha
anlamldr. rnein; mdrlere yaplacak zam, departmannn yapt kar miktarna bal olarak yzdelerle
belirlenebilir ya da sat elemanna verilecek zam miktar yapt sat says ile doru orantl olarak
belirlenebilir.


58 / 59



Temel Snfn Davranlarn Ezmek : virtual ve override

ok biimlilik, treyen snf tarafndan temel snfta yer alan bir yenin (metot, zellik, veya olay)
uygulannn nasl deitirileceine dair bir yol sunmaktadr. Bu yoldan ilerlemek iin ncelikle virtual ve
override anahtar kelimelerinin alma mekanizmalarnn anlalmas gerekir.

Bir temel snf ierisinde tanmlanan yenin uygulannn -yani yenin ierisindeki kodlarn-,
kendisinden treyen snflar tarafndan deitirilebilmesi isteniyorsa, bu ye virtual anahtar kelimesi ile
iaretlenmelidir.

namespace CokBicimlilik
{
class Calisan
{
//ZamYap() metodu varsaylan olarak, bir uygulama mantna sahip. Treyen snflar bu uygulamay
deitirmek ve aynen kullanmak konusunda zgrler.
public virtual void ZamYap(double zamMiktari)
{
this._maasi += zamMiktari;
}

public virtual string BilgiVer()
{
return this.SskNo + " / " + this.Adi + " / " + this.Maasi;
}

//Dier yeler
}
}

Treyen bir snf, sanal (virtual) bir yenin uygulann kendi snfna ait bir i mantyla deitirmek
isteyebilir; ancak zorunda deildir. stenirse temel snftaki uygulan biimi aynen miras alnp kullanabilir.
yenin bana override anahtar kelimesi yazlarak yeniden kodlanmas ile byle bir deiiklik salanr. rnein
SatisElemani snf ZamYap() ve BilgiVer() metodunun uygulamasn deitirsin, Mudur ise Calisan snfndaki
uygulamay aynen deitirmeden kullansn.

namespace CokBicimlilik
{
class SatisElemani : Calisan
{
//Dier yeler

public override void ZamYap(double zamMiktari)
{
double ekstraZam = 0;
if ((SatisSayisi > 0) && (SatisSayisi < 50))
{
ekstraZam = 30;
}

this._maasi += (zamMiktari + ekstraZam);
}

public override string BilgiVer()
{

59 / 59



string temelBilgi = base.BilgiVer();
temelBilgi += " / " + this.SatisSayisi;
return temelBilgi;
}
}
}




























































Bu ders notu, Ak Akademi projesi erevesinde TCM tarafndan Microsoft Trkiye iin hazrlanmtr.
Tm haklar Microsoft Trkiye ye aittir. zinsiz oaltlamaz, para ile satlamaz.

You might also like