Monday, September 24, 2012

Yapıcı Metotlar(Constructors) (c#)


Yapıcı Metotlar(Constructors)

Şu ana kadar gördüğümüz örneklerde bir sınıf nesnesinin üye elemanlarından olan özelliklere değerler verirken ya kendimiz
EnBoyBelirle() gibi metotlar tanımladık ya da '.' operatörü ile eğer eleman puplic ise direkt ulaştık. Ancak bu şekilde ilk
değer vermeler genellikle kullanılmaz, nesne yönelimli programlama tekniğinin getirdiği birtakım avantajlardan yararlanılır.

referans tipi oluşturulduğunda elemenlara  varsayılan değer atanıyordu. İşte bu işlemi yapan aslında otomatik çalışan bir
yapıcı metottur. Burdan da anlaşılacağı gibi biz tanımlamasakta her sınıfın bir yapıcı metotodu vardır. Bunlara
default constructor denilmektedir.

yapıcı metotların geri dönüş değerinin olmaması geri dönüş tipinin void olduğu anlamına gelir.


Şimdi örnek bir sınıf üzerinden yapıcı metotların nasıl bildirildiğine bakalım. Yapıcı metotların diğer metotlardan
2 farkı vardır. birincisi, yapıcı metotların geri dönüş değeri yoktur. yani geri dönüş değeri kavramı yoktur bu yüzden
metotun tipi tanımlanmaz. ikincisi yapıcı metotların ismi sınıf ismi ile aynı
olmak zorundadır.




Şimdi Ev adlı bir sınıf için bir yapıcı metot oluşturalım. Ev sınıfı içerisinde katno, odasayisi, alan, semt bilgisini tutan
bir veri yapısı olacaktır.

class Ev
{
   puplic int odasayisi;
   puplic int katno;
   puplic int alan;
   puplic string semt;


   Puplic Ev(int odasi, int kati, int alani, string semti)
   {
       odasayisi = odasi;
       katno = kati
       alan = alani;
       semt = semti;
   }
}

Friday, September 21, 2012

Erişim Belirleyici yardımıyla dosyaya yazma (C#)

Erişim Belirleyici yardımıyla dosyaya yazma


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace evler
{
    public class Ev
    {
        private int odasayisi;
        private int katno;
        private double alan;
        private string semt;
     
     
        public int Odasayisi
       {
           get
           {
               return odasayisi;
           }

           set
           {
               if (value < 0)
               {
                   FileInfo fi = new FileInfo("c:/Netgame/loglar.txt");
                   FileStream fs;
                      if (fi.Exists == true)
                       {
                          fs = new FileStream("c:/Netgame/loglar.txt", FileMode.Append);
                       }

                      else
                          fs = new FileStream("c:/Netgame/loglar.txt", FileMode.Create);

                      StreamWriter yazici = new StreamWriter(fs);
                      yazici.Write("hatalı deger girildi("+DateTime.Now+")");
                      yazici.Flush();
                      yazici.Close();
                      fs.Close();

               }
               value = Math.Abs(value);
               odasayisi = value;
           }
       }


         public int Katno
        {
            get
            {
                return katno;
            }

            set
            {
                this.katno = value;
            }
        }

         public double Alan
         {
             get
             {
                 return this.alan;
             }

             set
             {
                this.alan = value;
             }
         }

         public string Semt
         {
             get
             {
                 return semt;
             }

             set
             {
                 semt = value;
             }
        }

         public string EvGoster()
        {
            return string.Format(" Odasayisi: {0} \n Katno: {1} \n Alan: {2} \n Semt: {3}", odasayisi, katno, alan, semt);
        }
   }
}



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using evler;

namespace dosyalama
{
    class Program
    {
        static void Main(string[] args)
        {
            Ev ev1 = new Ev();

            ev1.Odasayisi = -5;
            ev1.Katno = 2;
            ev1.Alan = 120;
            ev1.Semt = "Besiktas";
         
            Console.WriteLine(ev1.EvGoster());
            Console.ReadLine();
        }
    }
}

Erişim belirleyicisi örneği (C#)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace evler
{
    public class EV
    {
        private int katno;
        private int odasayisi;
        private string semt;


        public string Evgoster()
        {
           return string.Format("kat: {0} \noda: {1}\nsemt: {2}", katno,odasayisi,semt);
        }

        public int Katno
        {
            get { return katno; }
            set { katno = value; }
        }

        public int Odasayisi
        {    
            get
            {
                return this.odasayisi;
            }
            set
            {
                if (value < 0)
                {
                    value = Math.Abs(value);
                   
                }
                this.odasayisi = value;
            }
        }
        public string Semt
        {
            get { return semt; }
            set { semt = value; }
        }

    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using evler;

namespace siniflar
{
    class Program
    {
        static void Main(string[] args)
        {
            EV ev1 = new EV();

            ev1.Katno = 3;
            Console.WriteLine("oda sayisi: ");
            ev1.Odasayisi = Convert.ToInt32(Console.ReadLine());
            ev1.Semt = "besiktas";


            Console.WriteLine(ev1.Evgoster());

            Console.ReadLine();
        }
    }

}

Protected Erişim Belirleyicisi (C#)


Protected Erişim Belirleyicisi

Sınıflar konusunda belirleyicilerini incelerken, protected erişim belirleyicisini türetmeyi anlatırken inceleyeceğimizi
söylemiştik. Kalıtım yolu ile sadece puplic ve protected elemanlar aktarılır. Temel sınıfta bulunan private üye elemanlara
türeyen sınıf içersinde ulaşamayız. Örneğin aşağıdaki kullanım geçersizdir.

using System;

class Memeli

{
  private double Boy;
  private double Agirlik;

  puplic void OzellikGoster()
  {
    console.WriteLine("Boy = " + Boy);
    console.writeline("Ağırlık = " + agirlik);
  }
}

class Kedi : Memeli
{
  puplic string Turu;
 
  puplic void BoyGoster()
  {
    Console.writeline("Boy = " + Boy);
  }
}

Burada Kedi sınıfı Memeli sınıfnda türemiş olmasına rağmen Kedi sınıfında bulunan BoyGoster() metodu içerisinden Memeli
sınıfındaki Boy özelliğinin private olarak bildirilmesidir. private özelliklerinde kalıtım yolu ile aktarılması için her
değişken için get ve set blokları tanımlanabilir. Bu durumda Memeli sınıfının private elemanlarına erişebiliriz.

Diğer sınıfların kullanımına kapalı ancak türetme ile türemiş sınıfa geçebilen özellikler protected anahtar sözcüğü ile
oluşturulur. Eğer türeme söz konusu değilse protected olarak bildirilen elemenlarla private olarak bildirilen elemanlar
arasında fark kalmaz. protected eleman içeren bir sınıf türetildiğinde bu elemanlar türemiş sınıflar içinde rahatlıkla
kullanılabilir. protected elemanlar diğer sınıflar için private olarak kalmaya devam eder. Buna göre asağıdaki sınıf
bildirimleri geçerlidir.

Get ve Set anahtar sözcükleri (C#)


Set ve get Anahtar sözükleri

get ve set anahtar sözlükleri ile bir özellik tanımlanır. Ancak bu özelliklere erişmek için belirli kod bolkarını çalıştırma
şansımız mevcuttur. Metotlar ve özellikler arasındaki tek fark özellikleri çağırırken, fonksiyon çağırmak için kullandığımız
parantezleri kullanmamızdır.

private olarak tanımlanan En ve Boy elemananlarının Dortgen sınıfı için bir arayüz oluşturmayacağı için ikisinde önüne
member(üye) sözcüğünü temsil eden "m" harfini koyacağız. Böylece orjinal isimler get ve set erişimlerini kullancağımız
özelliklerde kalacaktır.

Dortgen sınıfının yeni arayüzü aşağıdaki gibidir.

class Dortgen
{
    private int mEn;
    Private int mBoy;

    puplic int En
    {
       get
       {
         return mEn;
       }
   
       set
       {
          if (value <0)
              mEn= 0;
          else
          mEn=value;
       }
    }

    puplic int Boy
    {
       get
       {
         return mBoy;
       }
   
       set
       {
          if (value <0)
              mBoy= 0;
          else
          mBoy=value;
       }
    }
}


Value anahtar sözcüğü ise özelliklere atanacak nesnenin değerini ifade eder. Örneğin,

Dortgen d= new Dortgen();

d.En = 50;

ifadesinde value anahtar sözcüğü 50 değerini temsil etmektedir. Veri elemanı hangi türden ise value değeri de o türden olur.

This anahtar sözcüğü (C#)


This Anahtar Sözcüğü

Nesneler üzerinden metotlar çağrılırken aslında biz farkına varmadan metotlara gizlice ilgili nesnelerin referansları geçirilir.
Örneğin, this anahtar sözcüğünün anlamını daha iyi kavrayabilmek için soyutlama yapalım;

Dorgen d1= new Dortgen();

d1.EnBoyBelirle();

yerine aşağıdaki gibi bir kullanımda olabilirdi:

Dortgen d1 = new Dortgen();


d1.EnBoyBelirle(d1 'in referansı);

Eğer this anahtar sözcüğü olmasaydı ikinci şekildeki gibi bir kullanıma mecbur kalacaktık. İkinci şekildeki gibi bir kullanımın
kullanışsız olduğunu söyleyebiliriz. Bu yüzden C# dilini tasarlayanlar d1 nesnesinin referansını gizlice EnBoyBelirle()
metoduna aktarmada kullanılacak bir sistem geliştirmişlerdir. İşte this anahtar sözcüğü bu referansı temsil etmektedir.
this anahtar sözcüğü çok fazla kullanılmasa da bazı durumlarda faydalı olabilir; örneğin,
EnBoyBelirle() metodunun aşağıdaki gibi olduğunu düşünelim:

puplic void EnBoyBelirle(int En, int Boy)
{
     if(En < 0 || Boy < 0)
     {
           En= 0;
           Boy = 0;
     }
     else
     {
           En = En;
           Boy = Boy;
     }
}



EnBoyBelirle() metodunun parametreleri olan En ve Boy değişkenleri Dortgen sınıfının üye elemanları ile aynı isime sahiptir.
Metot gövdesinde kullandığımız En ve Boy değişkenleri EnBoyBelirle() metodunun parametleridir. Çünkü bir üst faaliyet
alanında olan Dortgen sınıfının En ve Boy değişkenleri EnBoyBelirle() metodunun parametleri tarafından görünmez hale gelmiştir.

Böyle bir durumda this anahtar sözcüğünü kullanarak mantıksal hatayı önlemiş oluruz.

puplic void EnBoyBelirle(int En, int Boy)
{
     if(En < 0 || Boy < 0)
     {
           this.En= 0;
           this.Boy = 0;
     }
     else
     {
           this.En = En;
           this.Boy = Boy;
     }
}


derleyecek olursak;

using System;


namespace ThisSoz
{
    class dortgen
    {
        public int En;
        public int Boy;

        public int Alan()
        {
            int Alan = En * Boy;
            return Alan;
        }
         public void EnBoyBelirle(int En, int Boy)
        {
            if (En < 0 || Boy < 0)
            {
                this.En = 0;
                this.Boy = 0;
            }
            else
            {
                this.En = En;
                this.Boy = Boy;
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            dortgen d1 = new dortgen();
            d1.EnBoyBelirle(2,-5);
            Console.WriteLine("En: " +d1.En +"  "+ "Boy: " +d1.Boy);
            Console.ReadLine();
        }
    }
}
ekran çıktısı olarak En: 0 Boy: 0 sonucunu alacağız.



this anahtar sözcüğü ile EnBoyBelirle() metodunun En ve Boy parametleri, o an üzerinde çalışılan Dortgen nesnesinin En ve Boy özelliklirine atanıyor. this anahtar sözcüğünün kullanımına olanak tanımamak okunabilirlik açısından önemlidir.


Sınıf oluşturma (c#)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace siniflar
{


    class Program
    {
        static void Main(string[] args)
        {
            EV ev1 = new EV();

            ev1.kat = 3;
            ev1.oda = 2;
            ev1.semt = "besiktas";

            Console.WriteLine(ev1.Evgoster());

            Console.ReadLine();
        }
    }


    public class EV
    {
        public int kat;
        public int oda;
        public string semt;

        public string Evgoster()
        {

            return string.Format(" kat numarasi: {0} \n oda sayisi: {1} \n semt: {2}", kat, oda, semt);
        }
    }
}