SAKARYA ÜNİVERSİTESİ Nesneye Dayalı Programlama Hafta 6 Prof. Dr. Ümit KOCABIÇAK Öğr. Gör. Özgür ÇİFTÇİ Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak hazırlanan bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz. Her hakkı saklıdır 2010 Sakarya Üniversitesi
6.1. Sınıf Üyeleri 3: Özellikler (Property) Sınıf üyelerinden alanların bilinçsiz yada kötü niyetli kullanımlarına karşın önlem almak gerekir. Benzeri şekilde veri bütünlüğü ve doğruluğu açısından alanların(field) sınıf dışına public olarak açılması önerilmemektedir. Örneğin integer tipinden tanımlanmış bir yas değişkenine negatif bir değer atanabilir. Yada verilerin belirli bir değer aralığında girilmesi istenebilinir. Bu noktada NDP, veri değerinin kabulünden sonra verinin şartları sağlayıp sağlamaması kontrolünden daha ziyade daha verinin kabulü esnasında verinin gerekli şartları sağlayıp sağlamadığının kontrolünü tavsiye eder. Şartlar sağlandığı taktirde de kabul edilmesi aksi taktirde sistemin zarar görmesini engeller. Bazen sınıflarda private bölgelere ulaşılması gerekmektedir. Bir çok sınıfta sarmalama gereği bu alanlara ulaşılmaması gerekirken, kalıtım olmayan yada paket içersinde yer alamayan bir sınıfın bu değere bağlı işlemler yapıyor durumu ile karşılaşılabilinir. Programların bazı bölümlerinde bir sınıfa ait alanların sadece okunabilme olanağı yada yalnızca yazılabilinip okunamama özellikleri sağlamak gerektiğinde özellikleri kullanabiliriz. Örnek 1: (Veri doğrulama) class Ornek public int yas; class Program Ornek o = new Ornek(); o.yas = -30; Console.WriteLine("Yaş : 0", o.yas); 2
Burada büyük bir hata vardır. Yaş hiç bir zaman negatif bir değer olamaz. Ancak yas değişkeni sınıf içersinde int olarak tanımlandığından negatif bir değer girilebilmektedir. Örnek 2: (Veri bütünlüğü)araçların trafiğe çıkış yılı baz alan bir banka 2-9 yaş araçlara 2. el kredisi vermektedir. class Banka public DateTime trafigecikistarihi; public int TasitYasiHesapla() return Convert.ToInt32(DateTime.Now.Year - trafigecikistarihi.year); class Program Banka ban = new Banka(); Console.Write("Aracın trafiğe çıkış tarihini giriniz :"); ban.trafigecikistarihi = DateTime.Parse(Console.ReadLine()); Console.WriteLine("Araç Yaşı: " + ban.tasityasihesapla()); 3
Örnek 1 deki gibi benzeri bir hata oluşmuş girilen tarih bugünün tarihinden büyük girilmiş ve hesaplamalar sonucu ekrana yazdırılmıştır. Oysaki burada bir kontrol yapılmalı bugünün tarihinden büyük değerler girildiğinde program hata mesajı üretmeliydi. Benzeri şekilde araç yaşı belirtilen 2-9 yaş aralığında ise kredininin verilebileceği aksi durumda ise kredinin verilemeyeceği şeklinde sonuçlara ulaşabilmeliydi. 2. örneğimizi aşağıdaki şekilde düzenleyelim. class Banka private DateTime trafigecikistarihi=datetime.now; public DateTime GetTrafigeCikisTarihi() return trafigecikistarihi; public void SetTrafigeCikisTarihi(DateTime tarih) if (tarih > DateTime.Now) Console.WriteLine("Hatalı Tarih Girişi"); else trafigecikistarihi = tarih; public int TasitYasiHesapla() return Convert.ToInt32(DateTime.Now.Year - trafigecikistarihi.year); class Program Banka ban = new Banka(); Console.Write("Aracın trafiğe çıkış tarihini giriniz :"); ban.settrafigecikistarihi(datetime.parse(console.readline())); Console.WriteLine("Araç Yaşı: " + ban.tasityasihesapla()); 4
6.2. C# ta Özellikler (Property) Veri doğrula, veri bütünlüğü ve public alanların güvenliği için C# özel yapıları sınıf üyesi olarak kabul etmiştir. Okunabilme (get) ve yazılabilme(set) yapıları özel bir blok içersinde gösterilmektedir. class Ornek private int yas; public int Yas get // okunabilme özelliği return yas; set // değer atanabilme(yazılabilme özelliği) yas = value; 5
class Program Ornek o = new Ornek(); o.yas = 30; Console.WriteLine(o.Yas); get bloğu içersinde okuma, set bloğu içersinde yazma işlemi yapılmaktadır. C# 3.0 ile gelen bir başka özellik ise default şekilde yazılan get-set bloğunun doldurulmasına gerek olmadan otomatik olarak tanımlanabilmesidir. class Yeni private string m_adi; public string Adi get; set; class Program Yeni y = new Yeni(); y.adi = "NDAT"; Console.WriteLine(y.Adi); 6
6.2.1. Sadece Okunabilir Özellikler (Property) NDP de sarmalama amacıyla değerinin değiştirilmesi güvenlik açısından yasaklanmış sadece okunabilir alanlar oluşturulama istendiğinde get-set bloğunda sade get tarafı yazılmalıdır. class getproperty private int yaricap = 20; public int Yaricap get return yaricap; class Program getproperty gp = new getproperty(); gp.yaricap = 100; // hata sadece değeri okunabilinir. Console.WriteLine(gp.Yaricap); 7
6.2.1. Sadece Yazılabilir Özellikler (Property) Değerinin değiştirilmesi sadece yazılabilinir ancak okunamayab özellikler oluşturulmak istendiğinde getset bloğunda sade set tarafı yazılmalıdır. class setproperty private int m_a; public int A set m_a = value; class Program setproperty sp = new setproperty(); sp.a = 200; Console.WriteLine(sp.A); // hata sadece değeri atabilinir. 8
6.2.1. Özelliklerde (Property) Kalıtım Taban sınıfta tanımlanan property diğer sınıf üyelerinde olduğu gibi direk olarak türemiş sınıflara geçmektedir. Ancak kalıtım alan sınıfların gelen özellikleri değiştirmek istedikleri taktirde virtual tanımlaması yapılabilinir 1. class BaseVirtualProperty public int X get return 10; set Console.WriteLine("Temel Sınıftan kalıtım Yolu ile geçmiştir"); public virtual int Y get return 20; set Console.WriteLine("Temel Sınıfta Y değeri 20 dir"); class DerivedVirtualProperty:BaseVirtualProperty public override int Y get 1 Propertylerin static, abstract olması ve arayüzlerde tanımlanması ileri konularda işlenecektir. 9
return 100; set Console.WriteLine("Türemiş Sınıfta Y değeri 100 dür"); class Program DerivedVirtualProperty dvp = new DerivedVirtualProperty(); Console.WriteLine(dvp.X); Console.WriteLine(dvp.Y); 10
Örnek: Bir önceki derste yaptığımız OrnekCalismaAlanHesaplama adlı uygulamanın düzenlenmesi. Dışarıdan girilen yarıçap ve yükseklik değerlerinin negatif olması durumu engellenmesi gerekmektedir. SekilBase Sınıfının aşağıdaki şekilde düzenleyelim. class SekilBase private double r; protected double R get return r; set if (value < 0) r = 0; else r = value; private double h; protected double H get return h; set if (value < 0) h = 0; r = 0; else h = value; public SekilBase() public SekilBase(double r, double h) this.r = r; this.h = h; protected virtual double AlanHesapla() return 0; public void EkranaYazdir() 11
Console.WriteLine(this.GetType().Name + " Alanı = 0:F2", this.alanhesapla()); class Nokta : SekilBase class Daire : SekilBase public Daire(double r) : base(r, 0) protected override double AlanHesapla() return Math.PI * R * R; class Kure : SekilBase public Kure(double r) : base(r, 0) protected override double AlanHesapla() return 4 * Math.PI * R * R; class Silindir : SekilBase public Silindir(double r, double h) : base(r, h) protected override double AlanHesapla() 12
return 2 * Math.PI * R * R + 2 * Math.PI * R * H; class Dikdortgen : SekilBase public Dikdortgen(double en, double boy) : base(en, boy) protected override double AlanHesapla() return R * H; class GenelSinif private double yaricap; private double yukseklik; public GenelSinif() this.ekranoku(); this.nesneolustur(); private void EkranOku() Console.Write("Yarıçap : "); yaricap = Convert.ToDouble(Console.ReadLine()); Console.Write("Yukselik: "); yukseklik = Convert.ToDouble(Console.ReadLine()); private void NesneOlustur() Nokta yeninokta = new Nokta(); Daire yenidaire = new Daire(yariCap); Kure yenikure = new Kure(yariCap); Silindir yenisilindir = new Silindir(yariCap, yukseklik); Dikdortgen yenidikdortgen = new Dikdortgen(yariCap, yukseklik); // Dikdörtgen // Ekranda Gösterilmesi yeninokta.ekranayazdir(); yenidaire.ekranayazdir(); yenikure.ekranayazdir(); yenisilindir.ekranayazdir(); yenidikdortgen.ekranayazdir(); //Dikdörtgen 13
class Program GenelSinif gs = new GenelSinif(); Programımızı çalıştırdığımızda; 14