C#’da farklı türden referansların birbirine aktarılması yasaklanmıştır. Örneğin, A ve B isminde iki sınıfımız olsun. A sınıfından oluşturulan bir nesnenin adresini B sınıfından oluşturulan bir referansta tutamayız, aynı şekilde B sınıfından oluşturulan bir nesnenin adresini de A sınıfından oluşturulan bir referansta tutamayız.
static void Main(string[] args) { B referans_B = new B(); A referans_A = new A(); referans_A = referans_B; // YANLIŞ referans_B = referans_A; // YANLIŞ }
Kalıtım ile Türetilmiş sınıftan oluşturulan bir nesnenin adresini, Temel sınıftan oluşturulan bir referansta tutabiliriz.
class Memeli { protected double Boy; protected double Agirlik; public Memeli(double boy, double agirlik) { this.Boy = boy; this.Agirlik = agirlik; } public void FizikselBilgi() { Console.WriteLine("Boyu:{0} - Ağırlığı:{1}", Boy, Agirlik); } } class Insan : Memeli { private string Irk; private string Ulke; public Insan(string ırk, string ulke, double boy, double agirlik) : base(boy, agirlik) { this.Irk = ırk; this.Ulke = ulke; } public void TurBilgisi() { Console.WriteLine("Irkı:{0} - Ülkesi:{1}", Irk, Ulke); } } class Kedi : Memeli { private string Tur; public Kedi(string tur, double boy, double agirlik) : base(boy, agirlik) { this.Tur = tur; } public void TurBilgisi() { Console.WriteLine("{0} Kedisi.",Tur); } }
Kedi ve Insan sınıfı Memeli sınıfından Türetilmiştir. Bu durum da Memeli sınıfı Temel sınıf, Insan ve Kedi sınıfı da Türetilmiş sınıftır.
static void Main(string[] args) { // Insan sınıfından oluşturulan nesnenin adresi, Insan sınıfından oluşturulan bir referansa atandı. Insan ref_insan = new Insan("Türk", "Türkiye", 1.70, 73); /* Insan sınıfı, Memeli sınıfından türetildiği için; Insan sınıfından oluşturulan bir nesnenin adresi, Memeli sınıfından oluşturulan bir referansa atanabilir. */ Memeli ref1_memeli = new Insan("Türk", "Azerbaycan", 1.75, 80); // Insan sınıfından oluşturulan bir referans, Memeli sınıfından oluşturulan bir referansa atanabilir. Memeli ref2_memeli = ref_insan; /* Kedi sınıfı Memeli sınıfından türetildiği için; Kedi sınıfından oluşturulan bir nesnenin adresi, Memeli sınıfından oluşturulan bir referansa atanabilir. */ Memeli ref3_memeli = new Kedi("Van", 0.30, 2.5); }
Açıklama satırlarında da belirtildiği üzere; Insan ve Kedi sınıfları Memeli sınıfından türetildiği için bu sınıflardan oluşturulan nesnelerin adresleri Memeli sınıfından oluşturulan referanslarda tutulabilir. Yalnız burada dikkat edilmesi gereken çok önemli bir husus bulunmakta. Memeli sınıfını inceleyecek olursak içerisinde “TurBilgisi()” adında bir metodun olmadığını görürüz. Bu yüzden Insan veya Kedi sınıfından oluşturulan bir nesnenin adresini Memeli sınıfından oluşturulan bir referansa aktardığımız taktirde “TurBilgisi()” metoduna erişemeyiz. Çünkü Memeli sınıfı içerisinde böyle bir metot bulunmamaktadır.
Türetilmiş sınıf, temel sınıf içerisindeki değişkenleri ve metotları kendi içerisinde tanımlanmış gibi kullanabilir. Ancak temel sınıf, türetilmiş sınıftaki değişkenleri ve metotları kullanamaz.
class Program { static void Bilgi(Memeli ref_memeli) { ref_memeli.FizikselBilgi(); } static void Main(string[] args) { Insan ref_insan = new Insan("Türk", "Türkiye", 1.70, 70); Bilgi(ref_insan); Kedi ref_kedi = new Kedi("Ankara", 0.15, 3); Bilgi(ref_kedi); } }
Insan ve Kedi sınıfları, Memeli sınıfından türetildiği için “Bilgi()” metoduna Insan ve Kedi sınıfından oluşturulan nesnelerin referanslarını parametre olarak gönderebiliriz.
Serdar YILMAZ