You are on page 1of 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

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.

2 / 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

3 / 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
4 / 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 5 dilidir. Simula, ALGOL 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

5 / 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.

6 / 59

ETM : ADO.NET

Blm : Nesne Ynelimli Programlamaya Giri

Konu : Veri ve Veriye Eriim Teknolojileri

7 / 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)


8 / 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.

9 / 59

Veri kaynaklar ve Uygulamalar arasndaki balant

10 / 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

11 / 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

12 / 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)

13 / 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

14 / 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

15 / 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) { }

16 / 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();

17 / 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.

18 / 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

19 / 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.

20 / 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

21 / 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;
22 / 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
23 / 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.

24 / 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

25 / 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

26 / 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
27 / 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(); } } }

28 / 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; } } }

29 / 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

30 / 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; }
31 / 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.

32 / 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.

33 / 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

34 / 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);
35 / 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; } }
36 / 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)
37 / 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.

38 / 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

39 / 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)


40 / 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.

41 / 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

42 / 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
43 / 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 {
44 / 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


45 / 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; } }
46 / 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); }

47 / 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; }
48 / 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; } }

49 / 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.

50 / 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

51 / 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.

52 / 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
53 / 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
54 / 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(); } } }

55 / 59

ETM : NESNE YNELML PROGRAMLAMA (OBJECT ORIENTED PROGRAMMING)

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

56 / 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.

57 / 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() {
58 / 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. 59 / 59

You might also like