Arama Sonuçları: 'C#'

Çoklu Kalıtım (Multiple Inheritance) ve Elmas Sorunu (Diamond Problem)

Çoklu Kalıtım, tanım olarak bir sınıfın aynı anda birbirinden bağımsız birden çok sınıftan türeyebilmesini ifade eder. Örneğin, "Nepenthes" sınıfını "Plant" sınıfından türetebileceğimiz gibi "Carnivorous" sınıfından da türetebiliriz. Her bitki etçil olmadığı için bu iki sınıf birbirinden bağımsızdır. İşte bu tarz bir durumda ortaya çıkan çoklu kalıtım özelliğini C++ dili desteklerken, daha modern Java ve C# dilleri desteklememektedir.

Esasında Nesne Yönelimli Programlama prensiplerine çok da yakışmayan Çoklu Kalıtım özelliği, modern nesne yönelimli dillerde Elmas Problemi denen bir probleme takılmaktadır. Nedir bu elmas problemi? Örnekleyelim:


public class Organism
{
	public virtual void Feed()
	{
	  Debug.WriteLine("Feeding...");
	}
}

public class Plant : Organism
{
	public override void Feed()
	{
	  Debug.WriteLine("Doing photosynthesis...");
	}
}

public class Carnivorous : Organism
{
	public override void Feed()
	{
	  Debug.WriteLine("Eating another organism...");
	}
}

public class Nepenthes : Carnivorous, Plant
{
}

public class SampleRunner
{
	public static void Run()
	{
	  var nepenthes = new Nepenthes();
	  nepenthes.Feed();
	}
}

C# ile yukarıdaki gibi sınıflar tanımladığımızda, compiler zaten "Class 'Nepenthes' cannot have multiple base classes: 'Carnivorous' and 'Plant'" hatası verecek ve kodlarımız derlenmeyecektir. Bu hatanın olmadığını varsayıp derlendiğini düşünelim. Bu durumda; Run betiğinde yer alan nepenthes varlığının "Feed" metodu çağırıldığında uygulama alt sınıflardan hangisine ait Feed metodunu çağıracaktır? Görüldüğü üzere Plant ve Organism sınıflarında Feed metodu override edilmiş ve elimizde iki farklı implementasyon var. Uygulamanın hangisini neye göre seçeceği problemi tam olarak elmas problemini anlatmaktadır. (Aşağıdaki gibi elmas şekline benzer bir kalıtım diyagramı probleme adını vermektedir.)
devamı için tıklayınız...


Çok Biçimlilik (Polymorphism) Nedir, Ne İşe Yarar?

Çok biçimlilik bir nesnenin, kalıtım yoluyla miras aldığı tüm tiplerde görüntülenebilmesi durumudur. Örneğin;

public interface IAnimal
{
    void MakeSound();
}

Yukarıdaki gibi hayvanı tanımlayan bir arayüz oluşturalım. Arayüz tek bir davranışa (Ses Çıkar) sahip olsun. Aşağıda ise bu arayüzü gerçekleştiren 3 sınıf tanımladık. Kedi, köpek ve köpekten türeyen Husky aynı arayüzü (IAnimal) gerçekleştiriyor.

internal class Cat : IAnimal
{
    public void MakeSound()
    {
        Debug.WriteLine("Meoww");
    }
}

internal class Dog : IAnimal
{
    public virtual void MakeSound()
    {
        Debug.WriteLine("Woof..");
    }
}

internal class Husky : Dog
{
    public override void MakeSound()
    {
        Debug.WriteLine("Auwww");
    }
}


devamı için tıklayınız...


Yapıcı (Constructor) Nedir?

Nesne yönelimli programlama konseptinde yapıcı (constructor), temel öğelerden biridir. Nesnenin yaratılma aşamasında çalışacak olan fonksiyonu tanımlar. Yapıcı, tanımlamadığınız takdirde varsayılan olarak ara seviyede oluşturulacaktır.

public class Car
{
  private int velocity;
  private int gear;
  private EngineStatus engineStatus;

  public Car()
  {
    velocity = 0;
    gear = 1;
    engineStatus = EngineStatus.Stopped;
  }
}

Yukarıdaki örnekte, aracın motoru çalışmayan vaziyette, birinci viteste ve hareketsiz olarak oluşturulacaktır.

Yapıcı, aşırı yükleme (overloading) özelliğine sahiptir. Ayrıca farklı erişim belirleyiciler (access modifier) ile tanımlanabilir. Aşağıdaki örnekte sınıfa ikinci bir yapıcı izi daha eklenmiştir. Buna göre araç nesnesi, sadece aynı kütüphane içerisinden (internal) erişilmek suretiyle, motor durumu belirtilerek de oluşturulabilir.


devamı için tıklayınız...


00:00:00
Saturday 15 Jan 2017
Altın Sözler
“Zalimlerin çarkı cahillerin çalışmayan kafalarıyla döner.”
Web hosting by Somee.com