Merhaba Arkadaşlar!
Bu yazıda, nesne yönelimli programlamanın önemli kavramlarından biri olan Polimorfizm (Polymorphism) konusuna değineceğiz. Polimorfizm, özellikle Unity projelerinde sıkça karşımıza çıkar ve kodlarımızı daha esnek, modüler ve yeniden kullanılabilir hale getirmemizi sağlar. Ayrıca, Metod Aşırı Yüklemesi (Overloading) ve Metod Geçersiz Kılma (Overriding) gibi kavramları örneklerle birlikte inceleyeceğiz.
Polimorfizm Nedir?
Polimorfizm, Yunanca “çok biçimlilik” anlamına gelir ve aynı isimdeki fonksiyonların veya metodların farklı şekillerde çalışmasını ifade eder. Nesne yönelimli programlamada, bir sınıfın birden fazla biçimde davranış sergilemesini sağlar. Polimorfizm, aynı metodun farklı sınıflar tarafından farklı şekilde uygulanmasına imkan tanır.
Unity’de polimorfizm, genellikle türetilmiş sınıflar (derived classes) üzerinden işler. Bu sayede, temel sınıfların davranışları, alt sınıflarda özelleştirilebilir ve farklı şekillerde kullanılabilir.
Metod Aşırı Yüklemesi (Overloading)
Metod aşırı yüklemesi (overloading), aynı isimde birden fazla metodun, farklı parametreler ile tanımlanması durumudur. Bu sayede aynı metod adı, farklı parametrelerle çağrıldığında farklı sonuçlar verir.
Örnek:
public class Character
{
public void Attack()
{
Debug.Log("Karakter saldırıyor.");
}
public void Attack(int damage)
{
Debug.Log("Karakter " + damage + " hasar veriyor.");
}
public void Attack(int damage, string weapon)
{
Debug.Log("Karakter " + weapon + " ile " + damage + " hasar veriyor.");
}
}
Bu örnekte, Attack() metodunun üç farklı versiyonu tanımlanmıştır. Parametresiz versiyon, damage alan versiyon ve hem damage hem de weapon alan versiyon farklı davranışlar sergiler. Böylece metodu ihtiyaçlara göre esnek bir şekilde kullanabilirsiniz.
Metod Geçersiz Kılma (Overriding)
Metod geçersiz kılma (overriding) ise, bir türetilmiş sınıfın, temel sınıftaki bir metodu yeniden tanımlamasıdır. Türetilen sınıf, temel sınıfta bulunan metodun davranışını değiştirerek özelleştirebilir. Bu özellik, polimorfizmin en önemli unsurlarından biridir.
Örnek:
public class Character
{
public virtual void Move()
{
Debug.Log("Karakter hareket ediyor.");
}
}
public class Player : Character
{
public override void Move()
{
Debug.Log("Oyuncu hareket ediyor.");
}
}
public class Enemy : Character
{
public override void Move()
{
Debug.Log("Düşman hareket ediyor.");
}
}
Bu örnekte, Character sınıfında tanımlanan Move() metodu türetilmiş Player ve Enemy sınıflarında yeniden tanımlanmıştır. virtual anahtar kelimesiyle temel sınıfta tanımlanan metod, override anahtar kelimesiyle alt sınıflarda geçersiz kılınabilir. Böylece Move() metodu her sınıfta farklı şekilde çalışır.
Polimorfizmin Uygulanması
Polimorfizm, nesne yönelimli programlamanın en güçlü özelliklerinden biridir ve projelerde daha esnek ve genişletilebilir yapılar kurmamızı sağlar. Bir örnek üzerinde polimorfizmin nasıl işlediğini görelim.
Örnek:
public class Character
{
public virtual void TakeDamage(int damage)
{
Debug.Log("Karakter " + damage + " hasar aldı.");
}
}
public class Player : Character
{
public override void TakeDamage(int damage)
{
Debug.Log("Oyuncu " + damage + " hasar aldı.");
}
}
public class Enemy : Character
{
public override void TakeDamage(int damage)
{
Debug.Log("Düşman " + damage + " hasar aldı.");
}
}
Bu örnekte, Character sınıfında bir TakeDamage() metodu tanımlanmış ve Player ile Enemy sınıflarında bu metod yeniden tanımlanmıştır. Şimdi, polimorfizmin faydalarını göstermek için bu sınıfların farklı nesnelerini tek bir Character referansı üzerinden kullanabiliriz:
Character player = new Player();
Character enemy = new Enemy();
player.TakeDamage(10); // Oyuncu 10 hasar aldı.
enemy.TakeDamage(15); // Düşman 15 hasar aldı.
Görüldüğü gibi, Player ve Enemy sınıfları Character sınıfından türediği için, her iki nesne de Character türünde bir değişkenle tutulabilir. Bu sayede polimorfizmi kullanarak farklı sınıfların ortak metodlarına aynı arayüz üzerinden erişebiliriz. Her nesne kendi TakeDamage() metodunu çağıracak ve buna göre davranış sergileyecektir.
Polimorfizmin Avantajları
- Esneklik: Polimorfizm, aynı metodun farklı sınıflarda farklı şekilde uygulanmasına olanak tanır. Bu sayede, aynı metod adıyla farklı davranışlar elde edilebilir.
- Genişletilebilirlik: Türetilmiş sınıflar, temel sınıfın metodlarını yeniden tanımlayarak yeni özellikler ekleyebilir. Böylece yazılım daha genişletilebilir hale gelir.
- Kod Tekrarını Azaltma: Türetilen sınıflar, temel sınıfın metodlarını kullanarak ortak davranışları tekrar etmek zorunda kalmazlar.
Polimorfizm, nesne yönelimli programlamada kod yapılarımızı daha modüler, esnek ve yönetilebilir hale getiren çok önemli bir özelliktir. Özellikle Unity projelerinde, karakter sınıfları ve diğer oyun öğeleri için polimorfizmi kullanarak daha güçlü ve esnek sistemler oluşturabilirsiniz. Aynı isimdeki metodları farklı şekillerde kullanarak, yazılım projelerinizde büyük avantajlar sağlayabilirsiniz!





