Farklı türlerden iki sınıf referansı birbirine atanamaz. Fakat istisna olarak türemiş sınıf türünden bir referans, taban sınıf türünden bir referansa doğrudan atanabilir. Yani türemiş sınıftan taban sınıfa doğrudan dönüştürme vardır.
Türemiş sınıf türünden bir referans, taban sınıf türünden bir referansa atandığında artık taban sınıf türünden referans bağımsız bir taban sınıf nesnesini değil, türemiş sınıf nesnesinin taban sınıf kısmını gösteriyor olur. Yani biz türemiş sınıf referansıyla işlem yaptığımızda türemiş sınıf nesnesinin taban kısmı üzerinde işlem yapmış oluruz.
1 2 3 4 5 6 7 8 9 10 11 12 |
class A { private int m_x; private int m_y; //... } class B : A { private int m_z; private int m_k; //... } |
Bu işlemin tam tersi yani taban sınıfı referansının, türemiş sınıf referansına atanması geçerli değildir.
Eğer böyle bir durum mümkün olsaydı, olmayan elemanlara erişilmesi gibi bir potansiyel tehlike oluşurdu.
1 2 3 |
A a = new A(); B b; b = a; // Error! |
Türemiş sınıftan taban sınıfa doğru otomatik dönüşümün olmasının nedeni türemiş sınıfın taban sınıfı kapsamadır. Halbuki tersi geçerli değildir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
using System; namespace CSD { class App { public static void Main() { B b = new B(); b.m_x = 10; b.m_y = 20; b.m_z = 30; b.m_k = 40; A a; a = b; Console.WriteLine(a.m_x); Console.WriteLine(a.m_y); a.m_x = 100; a.m_y = 100; Console.WriteLine(b.m_x); Console.WriteLine(b.m_x); } class A { public int m_x; public int m_y; //... } class B : A { public int m_z; public int m_k; //... } } } |
Anahtar Notlar: Her sınıf doğrudan yada dolaylı yoldan object sınıfından türetildiğine göre, her sınıf nesnesinin bir object kısmıda vardır. Fakat şekillerimizde bu object kısmı çizilmeyecektir. Bir methodun paramateresi taban sınıf türünden bir referanssa biz o methodu türemiş sınıf türünden bir referansla çağırabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void Main() { //... B b = new B(); //... Foo(b); } public static void Foo(A a) { //... } |
Kaynak:Kaan Aslan Hocanın Dersinde Tuttuğum Ders Notlarıdır.