14 – Classlar

  • C# nesne tabanlı bir dildir.
  • Bu zamana kadar data ve değişken(variable), döngüler, array’lar ve metodlar üzerine çalıştık.
  • C#’ta her şey aslında class’lar ve objeler ile ilişkilidir. Değişkenler ve metodlar kendi başlarına çok anlam ifade etmezler ancak bir nesne ile daha anlamlı hale gelirler.
  • Örneğin gerçek hayatta araba bir objedir, ve arabanın ağırlığı ve rengi gibi özellikleri, start – stop gibi fonksiyonları vardır.
  • Class, objelerin ön tanımlanmış halidir, yani bir modellemesidir.
  • Örneğin her insan bir objedir. Objeyi bir varlık gibi düşünelim.
  • Zihnimizde bir insan tasavvuru canlandırdığımızda aklımıza gelenlerin toplamı aslında Class’tır.
  • Yani insanın göz rengi, kilosu, ten rengi gibi kavramlar özellikleridir.
  • Koşmak, yüzmek, düşünmek gibi kavramlar ise fonksiyonlarıdır.
  • Bir insan modellenmek istense genel hatlarıyla bu şekilde kavramları düşünülür.

Projemize Class Ekleme

Araç örneğine geri dönelim ve aşağıdaki adımları izleyerek projemize yeni bir class ekleyelim.

Classlar isimli projemize fare ile sağ tık > Add > Class… seçelim

Açılan ekrandan ‘Class’ seçeneğinin seçili olduğundan emin olalım.

Aşağıda ‘Name’ isimli kutucuğa ‘Arac’ yazıp ‘Add’ butonuna tıklayalım.

Visual Studio’da projemizin dosyalarını görüntülediğimiz alanda Arac.cs isimli dosyanın oluştuğunu görürüz. Arac.cs dosyası yandaki gibi görüntülenecektir.

Arac isimli class’ımıza aşağıdaki gibi field’ları ekleyelim.

Burada;

  • Marka
  • Renk
  • UretimYili

gibi ifadeler ile sınıfımızın ilk field‘larını eklemiş olduk. Field aslında sınıf içerisinde tanımlanan ve o sınıfa ait üzerinde veri tutabilen her değişkene denir. Sınıfın yapı taşlarındandır.

Şimdi ise sınıfımıza bir metod ekleyelim.

Araç class’ına RenkDegistir metodu ekleyelim.

Araç class’ından bir obje oluşturalım. Object aslında class’ın gerçekte var olan halidir. Visual Studio’da proje sayfalarımızı gördüğümüz sağ taraftaki alandan Program.cs dosyamıza çift tıklayalım. Console uygulamamız çalışırken bu dosyadan okumaya başlar, dolayısıyla program çalışma kodlarımızın başlangıcını burada yazmamız gerekecektir.

Aşağıdaki kod parçasını inceleyelim.

5. satırda ilkArac isimli ve tipi Arac olan bir değişken tanımladık. Tıpkı int sayi demek gibi düşünebiliriz. Daha sonra = karşısına new Arac(); ifadesini kullandık. C#’ta new anahtar kelimesi (İngilizce’de yeni demektir) yeni bir nesne oluşturulacağı zaman kullanılır. Normalde int sayi = 3 deriz, ama bu bir nesne değildir, nesneler için new kullanılır. Daha sonra nesnemizin tipini yani Arac olarak belirttik. new Arac(); Burada parantez açıp kapattık, sanki metod çağırır gibi. Aslında bu Arac sınıfının bir metodunu çağırdık (constructor) ama bunu sonra detaylıca işleyeceğiz. Son durumda RAM üzerinde ilkArac isimli bir değişken oluştu ve değeri ise new Arac() yani yeni bir Arac nesnesi. Nesne içerisinde ise birden fazla field mevcut. Bunlar Marka, Renk ve UretimYili. Nesne bu üç field’a sahip. Ayrıca iki tane de metod bulundurmakta. Bunlar da BilgileriYazdir() ve RenkDegistir(string yeniRenk).

Şimdi ise 3. satırda using Classlar; ifadesini inceleyecek olursak, aşağıda göründüğü üzere Arac class’ı namespace Classlar içerisine konulmuş durumda.

İngilizce’de name: isim, space: uzay demektir. namespace Türkçe karşılığı isim uzayı olarak düşünebiliriz. Aslında class’lar namespace’ler içerisine yazılırlar, yani namespace’ler class kümeleri olarak da düşünebilir. namespace’lerin mantığı yazılan tüm class’ları derli toplu kategorize etmek içindir.

Program.cs‘de bu Arac class’ına erişmek için Arac class’ının bulunduğu namespace’i using anahtar kelimesi ile birlikte ekliyoruz. Böylece bu namespace içerisinde bulunan tüm class’lara artık erişip kullanabileceğiz.

Program.cs‘de yazılmış aşağıdaki kod parçacığını inceleyelim.

C#’ta nesnemizin sahip olduğu field ya da metodlara erişmek için nesnemizin adından sonra noktaya basarız. ilkArac. olarak kodumuzu yazdığımızda Visual Studio bizlere nesnemize ait erişilebilir tüm field ve metodları önerir. Yukarıdaki ekran görüntüsünde ise dört adet metod görünmekte. Metodlar sol taraflarında mor küpler ile gösterilirler. Fakat biz bu metodları Arac sınırı içerisine yazmamıştık. Yazmadığımız metodlar neden burada göründü de yazdığımız field ve metodlar görünmedi?

Öncelikle bu metodlar neden varlar ondan bahsedelim.

Equals, GetHashCode, GetType ve ToString() metodları. Bunlar C# dilinde yazılan her class’ta otomatikmen olurlar. Şimdilik detaylı olarak anlatmayacağız.

Gel gelelim bizim yazdığımız field ve metodlar neden burada Visual Studio tarafından önerilmedi. Arac.cs dosyamıza gidelim ve aşağıdaki değişikliği yapalım.

public anahtar kelimesi İngilizcede umumi, halka açık gibi manalara gelmektedir. Metodlarımızı public yaparak her yerden erişilebilir hale getirdik. Bu erişilebilirlik konularını daha sonra detaylıca işleyeceğiz.

Tekrardan Program.cs dosyamıza gidelim ve aşağıdaki kodu inceleyelim.

Görüldüğü üzere kendi yazdığımız metodlar buraya geldi. Yazdığımız field’lar public olmadıkları için, yani onları public olarak işaretlemediğimiz için onlar burada öneri olarak gelmedi.

ilkArac isimli nesnenin(yani obje) BilgileriYazdir() metodunu çağıralım ve uygulamamızı çalıştıralım.

Görüldüğü gibi Arac sınıfımızın metodu çalıştı ve bu metod içerisinde yazdığımız kodlarda ekrana bilgileri yazdırmıştık. Şimdi de aracın rengini değiştirmek için bir başka metodu, RenkDegistir() i çağıralım. Daha sonra da tekrar BilgileriYazdir() metodunu çağıralım.

Görüldüğü üzere RenkDegistir(“Siyah”) olarak çağırdığımız için nesnemizin Renk field’ının değeri Siyah olarak değiştirildi. Çünkü biz RenkDegistir() metodunda Renk field’ının değerinin gelen parametre değeri olması için gerekli kodu yazmıştık. Renk değişikliğinden sonra bilgiler tekrar yazdırdığımızda Renk: Siyah olarak ekrana yazdırıldığı görülmektedir. Buradan anlaşılacağı üzere nesnelerin özellikleri kod akışı içerisinde değişebilir. Tabi ki bu değişiklikler tamamen bizim yazdığımız kod ile olmaktadır.

Egzersiz

  • Insan isimli bir sınıf yazalım ve Isim, Soyisim, Yas ve Memleket field’ları olsun. Field’ları belirlerken uygun veri tipinde oluşturmayı unutmalım
  • Insan sınıfımıza “Merhaba benim adım …, Soyadım …, …. yaşındayım ve memleketim ….” gibi kendisini tanıtan, yani ekrana bu bilgileri yazdıran bir metod yazalım.

Constructor (Yapıcı Metod)

Constructor ingilizcede “yapıcı, inşaa edici” manasına gelir. C# dilinde ve bir çok nesne tabanlı dilde, bir nesne new anahtar kelimesi ile oluşturulurken o sınıfın constructor metodu çalışır. Bizler buraya kadarki örneklerimizde herhangi bir constructor metod yazmadık, fakat bu olmadığı anlamına gelmiyor. C# dilinde bir constructor belirtilmediğinde varsayılan olarak aşağıdaki gibi bir constructor mevcuttur.

Görüldüğü gibi public Arac() {} olarak yazılır. public olması heryerden erişilebilir olduğunu belirtmektedir. Constructor‘ın ismi sınıfın ismi ile aynı olur. Ve bir method gibi () ile devam eder sonra da süslü parantezleri vardır.

Constructor’ın olmasının sebebi nesne oluşturulurken field’ların başlangıç değerlerini verebilmemizi sağlar. Düşünelim ki yeni bir araç nesnesi oluşturacağımız zaman markasını, rengini ve üretim yılını constructor’a parametre yoluyla gönderelim ve field’lara bu değerleri atayalım.

Aşağıdaki düzenlemeyi yaparsak Program.cs ‘de new Arac() kısmı hata verir. Bunun sebebi constructor’ın artık parametre beklemesidir.

Görüldüğü gibi constructor’a üç adet parametre ekledik ve field’larımızın değerlerini gelen bu parametreler ile belirledik. Yani constructor çağırıldığında ve parametreler ile değerler geldiğinde Arac nesnemizin field’ları bu değerler olacaktır. Çünkü Marka = marka; ifadesi field olan Marka‘nın değerini parametre ile gelen marka yap demektir. Diğer field’lar için de böyledir. 17, 18 ve 19. satırlarda field’lara değer atamaları yaptık.

Arac constructor’ı üç adet parametre beklemekte fakat biz parametreleri göndermediğimiz için Program.cs‘de hata alıyoruz. Yeni araç nesnesi oluştururken artık constructor’a istediği parametreleri vermek durumundayız. Bu kodu aşağıdaki gibi düzenleyelim ve çalıştıralım.

Egzersiz

  • Arac sınıfına Fiyat isimli field ekleyelim.
  • Fiyat field’ını constructur’dan parametre ile alıp değerini atayalım.
  • Constructor’daki UretimYili parametresini default value = 2022 yapalım.
  • BilgileriYazdir() metodunda fiyatı da ekrana yazdıralım.

Program.cs ‘de gerekli düzenlemeleri yapalım. Uygulamayı çalıştırıp sonuçları görelim.

Egzersiz

  • Arac sınıfına FiyataZamYap(int zamMiktari) metodu yazalım.
  • Metod çağrıldığında aracın fiyatına parametrede gelen değer kadar zam yapmasını sağlayacak ve yeni fiyatı return edecek şekilde kodlayalım.
  • Program.cs‘de FiyataZamYap(int) metodunu çağırıp fiyatını artıralım.
  • Aracın rengini değiştirmek için metodu çağırdığımız kod satırlarını silebiliriz.
  • Aracsınıfına fiyata yüzde zam yapmak için bir metod yazalım.
  • Bu metod çağırıldığında aracın fiyatına verilen oranda zam yapıp yeni fiyatı return etmesini sağlayacak gerekli kodlamayı yapalım.
  • Program.cs‘de yeni yazdığımız metodu çağırıp % zam uygulatalım ve araç bilgilerini tekrar yazdıralım.

Egzersiz

  • Program.cs‘de yeni bir Arac nesnesi oluşturalım.
  • Nesnemizin adı ikinciArac olsun.
  • Araç markası Ford, renk Gri, fiyatı 300 bin ve üretim yılı ise 2010 olsun.
  • Nesnemizi oluşturduktan sonra araç bilgilerini ekrana yazdıralım.

Egzersiz

  • Program.cs‘de bu sefer aracımızı ekrandan aldığımız değerler ile oluşturalım.
  • Araç markası, renk, fiyatı ve üretim yılı bilgilerini ekrandan isteyelim.
  • Ekrandan okunan değerleri doğru şekilde Type Casting yaptıktan sonra ucuncuArac isimli nesnemizi oluşturalım ve bu değerleri constructor’a geçelim.
  • Araç bilgilerini yazdıralım.