Nesne yönelimli programlamanın günümüzde ne kadar yaygın olduğunu
programlama ile ilgilenen herkes bilmektedir. Nesne Yönelimli Programlama (NYP)
yaklaşımında temel olan prensiplerden birisi bilgi gizleme (information
hiding)'dir. Bu prensibi projelerimizde uygulamak için C#'in sunduğu en önemli
araçlardan biri olan sınıf özellikleri (class properties) konusunu inceleyeceğiz.
Bildiğiniz gibi, C# dilinde tasarlanmış bir sınıfta iki temel unsur
bulunur. Birincisi sınıfın özellikleri (fields), ikinicisi ise sınıfın
metodlari (methods)'dır. Herhangi bir sınıfın özellikeri sınıfta tutulan ilişikili
verilerlerdir. Diğer taraftan sınıfın bizim için değişik işleri yapmasını
metodları vasıtasıyla sağlarız. Sınıf tasarımı çok önemli bir iş olup; deneyim,
konsantrasyon ve dikkat ister. Sınıfımızın özelliklerini tutan veriler, program
akışı sırasında sınıf dışında değiştirilebilir veya bu değerlere ulaşmak
istenebilir.
Bu durumda akla ilk gelen çözüm sınıfın verilerinin hepsinin dışarıdan
ulaşilabilmesini ve değiştirilebilmesine olanak sağlayan public anahtari ile
tanımlamakdir. Aşağıdaki programda bu tür bir çözümün uygun olabileceği düşünülmüştür:
using System;
namespace Property_Makale
{
class Otomobil
{
public int model;
public string marka;
public string renk;
{
class Otomobil
{
public int model;
public string marka;
public string renk;
public Otomobil(int model, string marka, string renk)
{
if(model>DateTime.Now.Year)
this.model=DateTime.Now.Year;
else this.model=model;
this.marka=marka;
this.renk=renk;
}
{
if(model>DateTime.Now.Year)
this.model=DateTime.Now.Year;
else this.model=model;
this.marka=marka;
this.renk=renk;
}
public void OzellikleriGoster()
{
Console.WriteLine("\nOtomobilimizin Özellikleri: ");
Console.WriteLine("\t Marka: "+ marka);
Console.WriteLine("\t Model: "+ model);
Console.WriteLine("\t Renk: "+ renk+"\n" );
}
}
{
Console.WriteLine("\nOtomobilimizin Özellikleri: ");
Console.WriteLine("\t Marka: "+ marka);
Console.WriteLine("\t Model: "+ model);
Console.WriteLine("\t Renk: "+ renk+"\n" );
}
}
class OtomobilTest
{
static void Main(string[] args)
{
Otomobil oto1 = new Otomobil(2000, "BMW" , "Siyah");
oto1.OzellikleriGoster();
{
static void Main(string[] args)
{
Otomobil oto1 = new Otomobil(2000, "BMW" , "Siyah");
oto1.OzellikleriGoster();
oto1.model=300;
oto1.OzellikleriGoster();
}
}
}
}
}
}
Yukarıdaki kod örneğimizde iki tane sınıf bulunmaktadır. Otomobil sınıfı ile otomobil nesnelerimizi oluşturabiliriz.
Ayrıca bu sınıfın OzellikleriGoster() metodu
ile herhangi bir otomobil nesnemizin özelliklerini görmek için ekrarana yazdırıyoruz.
İkinci sınıfımızda (OtomobilTest) ise Otomobil
sınıfımızdan nesneler oluşturmak ve onların özellikerini çağırmak için
kullanacağız. Şimdi isterseniz Main() fonksiyonunu incelemeye başlayalım.
Metodun hemen ilk başında oto1 isimli nesnemizi oluşturuyoruz. oto1 nesnemizin
özellikleri 2000 model, siyah ve BMW olsun. Bir sonraki satırda oto1 nesnemizin
modelini 300 yapıyoruz. İşte burda büyük bir hata yapılıyor! Çünkü 300 yılında
henüz otomobil üretilmemişti. Böyle bir hatayı nasıl önleriz? Çözüm olarak
otomobil nesnemizin herhangi bir özelliğini değiştirmek için ayrı bir metod
yazmamız gerekir. O zaman programızı şu şekilde değiştirmemiz gerekiyor:
using System;
namespace Property_Makale
{
class Otomobil
{
private int model;
public string marka;
public string renk;
{
class Otomobil
{
private int model;
public string marka;
public string renk;
public Otomobil(int model, string marka, string renk)
{
if(model>DateTime.Now.Year)
this.model=DateTime.Now.Year;
else this.model=model;
this.marka=marka;
this.renk=renk;
}
{
if(model>DateTime.Now.Year)
this.model=DateTime.Now.Year;
else this.model=model;
this.marka=marka;
this.renk=renk;
}
public void OzellikleriGoster()
{
Console.WriteLine("\nOtomobilimizin Özellikleri: ");
Console.WriteLine("\t Marka: "+ marka);
Console.WriteLine("\t Model: "+ model);
Console.WriteLine("\t Renk: "+ renk+"\n" );
}
{
Console.WriteLine("\nOtomobilimizin Özellikleri: ");
Console.WriteLine("\t Marka: "+ marka);
Console.WriteLine("\t Model: "+ model);
Console.WriteLine("\t Renk: "+ renk+"\n" );
}
public void ModelDegistir(int yeniModel)
{
if( (yeniModel>DateTime.Now.Year)||(yeniModel<1900) )
Console.WriteLine("Otomobilin modeli su an ki yildan büyük veya 1900'den küçük olamaz ! ");
else this.model=yeniModel;
}
}
{
if( (yeniModel>DateTime.Now.Year)||(yeniModel<1900) )
Console.WriteLine("Otomobilin modeli su an ki yildan büyük veya 1900'den küçük olamaz ! ");
else this.model=yeniModel;
}
}
class OtomobilTest
{
static void Main(string[] args)
{
Otomobil oto1 = new Otomobil(2000, "BMW" , "Siyah");
oto1.OzellikleriGoster();
{
static void Main(string[] args)
{
Otomobil oto1 = new Otomobil(2000, "BMW" , "Siyah");
oto1.OzellikleriGoster();
oto1.ModelDegistir(300);
oto1.OzellikleriGoster();
}
}
}
oto1.OzellikleriGoster();
}
}
}
Yukarıdaki programda Otomobil sınıfına ModelDegistir(int
yeniModel) metodunu ekledik. Bu metod ile modeli değiştirilecek nesnenin
modelinin şu anda bulunulan yıldan sonra ve 1900'den önce yapılmak istendiğinde
hata mesajı veriyor ve modelini değiştirmiyor. Ayrıca sınıf içindeki model değişkenin
tanımlanmasında private anahtarını da kullandığımıza dikkat ediniz. Bu şekildeki
bir yaklaşım ile hem sınıfın iç işleyişini sınıf dışından saklamış oluyoruz hem
de sınıfa ait verilerin değiştirilmesini sırasındaki hataları en az seviyede
tutmayı sağlıyoruz.
Fakat yukarıdaki yöntemi genelde C++ programcıları kullanır(dı). Bizler
C# programcıları olarak daha gelişmiş bir yola sahibiz. Sınıf içindeki değerleri
değiştirmek ve ulaşmak için özellik (Property) aracını kullanırız. Aşağıdaki
program ise C#'ın özellikleri nasıl kullandığına bir örnektir:
using System;
namespace Property_Makale
{
class Otomobil
{
private int model;
public string marka;
public string renk;
{
class Otomobil
{
private int model;
public string marka;
public string renk;
public Otomobil(int model, string marka, string renk)
{
if(model>DateTime.Now.Year)
this.model=DateTime.Now.Year;
else this.model=model;
this.marka=marka;
{
if(model>DateTime.Now.Year)
this.model=DateTime.Now.Year;
else this.model=model;
this.marka=marka;
this.renk=renk;
}
}
public void OzellikleriGoster()
{
Console.WriteLine("\nOtomobilimizin Özellikleri: ");
Console.WriteLine("\t Marka: "+ marka);
Console.WriteLine("\t Model: "+ model);
Console.WriteLine("\t Renk: "+ renk+"\n" );
}
{
Console.WriteLine("\nOtomobilimizin Özellikleri: ");
Console.WriteLine("\t Marka: "+ marka);
Console.WriteLine("\t Model: "+ model);
Console.WriteLine("\t Renk: "+ renk+"\n" );
}
public int Model
{
get
{
return model ;
}
{
get
{
return model ;
}
set
{
if((value>DateTime.Now.Year)||(value<1900) )
{
Console.WriteLine("Otomobilin modeli su an ki yildan büyük veya 1900'den küçük olamaz ! \n");
}
else this.model=value;
}
}
}
{
if((value>DateTime.Now.Year)||(value<1900) )
{
Console.WriteLine("Otomobilin modeli su an ki yildan büyük veya 1900'den küçük olamaz ! \n");
}
else this.model=value;
}
}
}
class OtomobilTest
{
static void Main(string[] args)
{
Otomobil oto = new Otomobil(2000, "BMW" , "Siyah");
Console.WriteLine("Otomobilimizin modeli: "+ oto.Model);
{
static void Main(string[] args)
{
Otomobil oto = new Otomobil(2000, "BMW" , "Siyah");
Console.WriteLine("Otomobilimizin modeli: "+ oto.Model);
oto.Model=300;
oto.OzellikleriGoster();
}
}
}
oto.OzellikleriGoster();
}
}
}
Çıktısını gördüğünüz program kodunda C#'ın özellik tanımlama ve kullanma
yöntemini kullandık. Özellikler ile herhangi bir nesneye ait değişkenin değerini
öğrenebilir ve değiştirebiliriz. Yukarıdaki örnek kodda yeralan aşağıdaki kısımda
bir özellik(Property) tanımlıyoruz. Genellikle bir özelliğin ismi üzerinde iş
yaptığı değişkenin ismi ile aynı olup sadece ilk harfi büyük olur. Aslında bu
bir zorunluluk değil. Sadece C#'da bu bir gelenektir. Bu şekilde bir kullanım
bizim kodumuzu okuyanların kodu daha kolay anlaması ve bizim başkalarının
kodlarını daha kolay anlamamıza yardımcı olur. Bir özelliğin tanımında özellik
isminden önce ne tür bir değer dönderecekse onun tipini belirtmeliyiz. Bu
genelde özelliğin ilgili olduğu değişkenin tipidir
public int Model
{
get
{
return model ;
}
{
get
{
return model ;
}
set
{
if((value>DateTime.Now.Year)||(value<1900) )
{
Console.WriteLine("Otomobilin modeli su an ki yildan büyük veya 1900'den küçük olamaz ! \n");
}
else this.model=value;
}
}
}
{
if((value>DateTime.Now.Year)||(value<1900) )
{
Console.WriteLine("Otomobilin modeli su an ki yildan büyük veya 1900'den küçük olamaz ! \n");
}
else this.model=value;
}
}
}
Özellikler içinde get ve set olmak üzere iki ayrı blok kod olur. İstersek
sadece get veya sadece set blokları olan özellikler de yazabiliriz. get bloğunda
ilgili değişkenimizin değerini dışarıya döndeririz. set bloğunda ise değişkenimizin
değerini değiştiririz. Burda gereken kontrolleri yapıp daha sonra uygunsa
girilen değeri kabul edebiliriz. Eminimki get bloğu içinde dikkattinizi değişkeni
ismi yerine value şeklinde çağırmamız çekmiştir.
Bu sayede kod içinde karışıklık olmaz. Zaten sadece bir tane değişken üzerinde
çalışıyorsunuz.
Bu makalemizde C# dilinde yeralan özellik (Property) kavramını
inceledik.Bir sonraki makalemizde görüşmek üzere.
Hayırlı olsun hepimize....
YanıtlaSilTeşekkür ederiz.
YanıtlaSil