• 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(); } }