Inheritance (Miras Kavramı)

Eyl 08, 2013
Nesne Yönelimli Programlama (Object Oriented Programming) dillerindeki ana prensiplerinden biri Miras(Inheritance) kavramıdır. Bir sınıfın özelliklerinin ve metotlarının başka sınıflara aktarılarak işlevinin artırılmasını sağlar. Oluşturulan ve genel özellikler içeren ilk sınıfa temel sınıf (base class), ondan miras alınarak özelleştirilen alt sınıflara türetilmiş sınıflar (derived class) denir. Miras kavramı, birbirlerine benzeyen sınıfları tek tek yazmak yerine, ortak üyeleri belirleyerek bir temel sınıf oluşturmak ve geri kalanlarını bu sınıftan türetmek gibi pratik bir yol sunar.
Miras kavramı kapsama anlamında düşünülmemelidir. Örneğin, bir Pencere sınıfı bir de Oda sınıfı olduğu düşünülürse, oda sınıfı ve pencere sınıfı arasında türetme ilişkisi kurulamaz. Çünkü Pencere sınıfı, Oda sınıfının genel özelliklerini taşımamaktadır.
Örnekte görüldüğü gibi, bir “MyBase” temel sınıfından “MyDerived” sınıfını türetilirse, MyBase sınıfındaki metotlar MyDerived sınıfında da kullanılabilir.

Uygulama:

public class MyBase
{
     private int num;
     protected string name;

     public MyBase()
     {
       Console.WriteLine("in MyBase()");
     }

     public MyBase(int i)
     {
        num = i;
        Console.WriteLine("in MyBase(int i)");
      }

     public int GetNum()
     {
        return num;
      }

     public MyBase(string s)
     {
         name = s;
         Console.WriteLine("in MyBase(string s)");
     }

     public string GetSt()
     {
         return name;
     }
}

public class MyDerived : MyBase
{
     public MyDerived() : base()
     {
     }

      public MyDerived(int i) : base(i)
      {
      }

       public MyDerived(string s) : base(s)
       {
       }
}

class Program
{
       public static void Main()
       {
           MyDerived md = new MyDerived();
           MyDerived md1 = new MyDerived(1);
           MyDerived md2 = new MyDerived("deneme");
        }
}


 

Bir sınıftaki "protected" ve "private" metotlara dışarıdan erişilemezken, türetilen sınıflarda temel sınıfın "protected" elemanları kullanılabilir. Bu özellikle, örnekte MyBase sınıfında "protected" tanımlanan string tipindeki "name" değişkenine MyDerived sınıfından da ulaşılabilmektedir. Int tipindeki “num” değişkeni "private" tanımlandığı için türetilen sınıftan da doğrudan ulaşılamaz. Ancak temel sınıfta tanımlanan ve bu "private" değişkeni kullanan metot, türetilen sınıfta kullanılabilmektedir.
Türetilmiş sınıfın başlangıç metodunun taban sınıfının hangi başlangıç metodunu çağıracağı “:base” şeklinde belirtilmektedir. Örnekte doğrudan temel sınıfın başlangıç metodu belirtilmiştir. Bu komut hiç kulllanılmadığında da temel sınıfın varsayılan başlangıç metodu çağrılır. Yani bu komutun hiç belirtmemesiyle ": base()" tamamen aynı anlamdadır.
Bir temel sınıftan birden fazla sınıf türetilebilirken, türetilen sınıflar birden fazla temel sınıf kullanamazlar. Buna Uygulama Mirası(Implemention Inheritance) denir. Ancak arayüz(interface) sınıflardan türetilirse birden fazla temel sınıf kullanılabilmektedir. Buna Arayüz Mirası(Interface Inheritance) ismi verilmiştir. Bu durum Çoklu Miras(Multiple Inheritance) olarak da adlandırılır.