Download as pdf or txt
Download as pdf or txt
You are on page 1of 16

Method Signature

• Bir metodun ismiyle birlikte sırasıyla aldığı parametre


tipleri, o metodun signature'unu oluşturur.
• Siz bir metot çağırdığınızda, öncelikle o nesnede o isimde
bir metot olup olmadığına bakılır.
• Eğer varsa, çağırdığınız parametreler’in tipleriyle birlikte
eşleştirme yapılır ve uygun bir metot varsa derleme işlemi
başarılı olur.
• Aksi takdirde kod derlenemez.
• Bir nesnenin bir metodunu çağırdığınızda compiler
kızıyorsa ve siz metot ismini doğru yazdığınıza eminseniz,
bilin ki verdiğiniz parametreler ya eksiktir, ya fazladır, ya
sırası yanlıştır ya da parametre tipleri yanlıştır.
Nesneye-yönelik programlamanın temel
ilkeleri - ÇOK BiÇiMLiLiK (Polymorphism)
• Genel anlamı ile bir adın birbiriyle alakalı fakat teknik
açıdan farklı iki veya daha fazla amaç için kullanılabilmesi
yeteneğidir.
• NYP’de ise oluşturulan nesnelerin gerektiğinde başka bir
nesne gibi davranabilmesine denir.
• Çok biçimlilikle programdaki her nesne kendi davranışını
değiştirmeden, kalıtım hiyerarşisine göre farklı biçimlerde
görülebilir.
Çok Biçimlilik Örnegi
• Örneğin C dilinde, mutlak değer bulma işlemi için üç
farklı fonksiyon tanımlıdır: abs(), labs() ve fabs().
• Fakat çok biçimliligi destekleyen C++'da bu
fonksiyonlar, abs() gibi tek bir isimle adlandırılırlar.
• Fonksiyonu çağırmak için kullanılan veri tipi, gerçekte
hangi fonksiyonun çalışacağını belirler.
• Böylece bir fonksiyon adının birkaç farklı amaç için
kullanılması mümkündür.
• Buna fonksiyonların aşırı yüklenmesi(overloading)
denir.
Çok Biçimlilik Örnegi
Nesne Dizileri
• Bir önceki örnekteki Zaman sınıfı kullanılarak nesne dizisi
oluşturulmuştur.
• Bu durumun bir tamsayı (int) dizisi oluşturmaktan farkı yoktur.
Aslına bakıldığında temel tiplerle yapılan dizi işlemleri ile kullanıcı
tabanlı sınıfların dizi işlemleri arasında da bir fark olması beklenmez.
class Program
{
static void Main(string[] args)
{
Zaman[] saat = { new Zaman(), new Zaman(9, 20, 40) };
for (int i = 0; i < 2; i++)
{
Console.WriteLine("saat" + i);
saat[i].alZaman();
saat[i].alBasitZaman();
}
}
}
Nesne Bileşimi
• C# nesne tabanlıdır. Bunu aklımızda tuttuğumuzda bir nesnenin
bir başkasının içine dahil edilebileceği garip gelmez.
• Buna nesneye dayalı programlamada nesne bileşimi (object
composition) denir ve sahip olma ilişkisi olarak da adlandırılır.
Örnek kodu inceleyecek olursak;
Nesne Bileşimi
public class Zaman
{
private int saat, dakika, saniye;
public Zaman() { belirleZaman(0, 0, 0); }
public Zaman(int saat, int dakika, int saniye)
{ belirleZaman(saat, dakika, saniye); }
public void belirleZaman(int saat, int dakika, int saniye)
{ this.saat = saat; this.dakika = dakika; this.saniye = saniye; }
public void alZaman()
{ Console.WriteLine(saat + ":" + dakika + ":" + saniye); }

public void alBasitZaman()


{ Console.WriteLine(saat % 12 + ":" + dakika + (saat < 12 ? " AM" : " PM"));
}
}
Nesne Bileşimi
public class Tarih
{ private int gun;
private int ay;
private int yil;
public Tarih() { belirleTarih(1, 1, 1900); }
public Tarih(int gun, int ay, int yil)
{ belirleTarih(gun, ay, yil); }
public void belirleTarih(int gun, int ay, int yil)
{ this.gun = gun; this.ay = ay;this.yil = yil;}
public void alTarih()
{ Console.WriteLine(gun + "/" + ay + "/" + yil); }
public void alTarihABD()
{ Console.WriteLine(ay + "." + gun + "." + yil); }
}
Nesne Bileşimi
public class Takvim
{ private Zaman saat;
private Tarih birTarih;
public Takvim()
{ saat = new Zaman(21, 15, 30);
birTarih = new Tarih(19, 03, 1984);
}
public void bilgiGoster(bool yerli)
{ if(yerli)
{ birTarih.alTarih(); Console.WriteLine(" ");
saat.alZaman(); Console.WriteLine();
}
else
{ birTarih.alTarihABD(); Console.WriteLine(" ");
saat.alBasitZaman(); Console.WriteLine();
}
}
}
Nesne Bileşimi
class Program
{
static void Main(string[] args)
{ Takvim birTakvim=new Takvim();
Console.WriteLine("Yerliler icin takvim");
birTakvim.bilgiGoster(true);
Console.WriteLine("Yabancilar icin takvim");
birTakvim.bilgiGoster(false);
}
}

Bu kodda önceden yazmış olduğumuz


zaman sınıfına ek olarak bir tarih sınıfı
oluşturduk ve bu sınıfta tutulan bir
tarihi amerikan ve avrupa
standartlarına göre yazdırma işlevi
sağladık.
Yöntem Aşırı Yükleme (Method Overloading)
• Bir metod'la aynı isimde başka bir metot yazılabilir. Buna
overloading denir.
• Bu işlem, benzer işlemleri farklı parametelerle yapan iki metot
için yapılır.
• Bu şekilde, bir çok metot ismini öğrenmekten kurtulmuş
oluruz.
• Ancak, overloading işleminde yeni metodun signature'u
mutlaka farklı olmalıdır ki bir metot çağırdığınızda hangisini
çalıştırdığınız anlaşılabilsin.
• Zaten aynı isimde aynı parametreleri aynı sırada alan bir ikinci
metot yazmanın hiç bir anlamı yoktur.
Yöntem Aşırı Yükleme (Method Overloading)
• Kurucularda olduğu gibi yöntemler de aşırı yüklenebilir. Aynı
adlı birden fazla yöntem, parametre listelerindeki farklılıklar
sayesinde birbirlerinden ayrılabilir.
• Birden fazla kurucu yazmak istediğimizde aşırı yükleme
kaçınılmaz, çünkü kurucular sınıf ile aynı adı taşımak zorunda.
Peki sıradan yöntemler için neden aynı adı kullanalım ki?
• Eğer aynı işi farklı şekillerde gerçekleştiren ya da farklı
parametre listeleri ile çalışarak aynı işi gerçekleştiren
yöntemler yazmak istiyorsak, bu yöntemlerin her biri için ayrı
adlar belirlemek yerine, yapılan işi özetleyen tek bir adı
kullanmak hem daha kolay hem daha anlamlıdır.
Yöntem Aşırı Yükleme (Method Overloading)
class Zaman
{
public int saat,dakika,saniye;
public Zaman(int saat)
{
if (saat >= 0 && saat < 24) this.saat = saat;
}
public Zaman(int saat, int dakika)
{
if (saat >= 0 && saat < 24) this.saat = saat;
if (dakika >= 0 && dakika < 60) this.dakika = dakika;
}
public Zaman(int saat, int dakika, int saniye)
{
if (saat >= 0 && saat < 24) this.saat = saat;
if (dakika >= 0 && dakika < 60) this.dakika = dakika;
if (saniye >= 0 && saniye < 60) this.saniye = saniye;
}
Yöntem Aşırı Yükleme (Method Overloading)
public void ilerle(int sn)
{
saniye += sn;
if (saniye > 59)
{
dakika += saniye / 60;
saniye %= 60;
if (dakika > 59)
{
saat += dakika / 60;
dakika %= 60;
if (saat > 23)
{
saat %= 24;
}
}
}
}
Yöntem Aşırı Yükleme (Method Overloading)
public void ilerle()
{
saniye++;
if (saniye == 60)
{
saniye = 0;
dakika++;
if (dakika == 60)
{
dakika = 0;
saat++;
if (saat == 24)
{
saat = 0;
}
}
}
}
public void zamaniYaz() {
Console.WriteLine("Şu anki zaman: " +saat + ":" + dakika + ":" + saniye);
} }
}
Yöntem Aşırı Yükleme (Method Overloading)
class Program
{
static void Main(string[] args)
{
Zaman z1 = new Zaman(22,20,5);
z1.zamaniYaz();
z1.ilerle(); z1.zamaniYaz();
z1.ilerle(5); z1.zamaniYaz();
}
}

You might also like