:::: MENU ::::

Aşağıya doğru dönüştürme (Down Casting)

Türemiş sınıftan taban sınıfa dönüştürme yapıldıktan sonra programcı, bu taban sınıf referansını yeniden türemiş sınıf türüne dönüştürmek isteyebilir. Bu tür dönüştürmelere aşağıya doğru yapılan dönüştürmeler denir. İşte taban sınıftan türemiş sınıfa doğrudan (implicit) dönüştürme yoktur. Tür dönüştürme operatörüyle (Explicit) dönüştürme vardır.

    
                        A x;
			B y = new B();
			x = y;
			//...
			B z;
			z = x; // Error!
			z = (B)x; // Geçerli!


Yukarıdan aşağıya doğru dönüştürmeler herzaman derleme aşamasında kabul edilir. Fakat programın çalışma aşamasında akış dönüştürme noktasına geldiğinde ayrıca bir haklılık kontrolü CLR tarafından yapılmaktadır.

Aşağıya doğru dönüştürme uygulanırken programın çalışma zamanı sırasında ayrıca dönüştürülmek istenen referansın gösterdiği yerdeki nesnenin dönüştürülmek istenen türün elemanlarını içerip içermediğine bakılır. Yani dönüştürülmek istenen referansın dinamik türü dönüştürülmek istenen türü kapsıyorsa dönüştürme haklıdır. Kapsamıyorsa dönüştürme haksızdır exception oluşur.

  
                        A a = new A();
			B b;
			b = (B)a;
			// Derleme Geçilir, Fakat 
			// Çalışma zamanında exception oluşur

Burada dönüştürülmek istenen referans a’ dır. Dönüştürülmek istenen tür B’ dir. a’ nın dinamik türü A’ dır. B’ yi kapsamamaktadır.
Fakat örneğin;

 
                        A a=new B();
			B b;
			b=(B)a;	// Derleme Başarılı ve Çalışma zamanında
					// Exception oluşmaz
                        object o = "Ankara";
			string s;

			s = (string)o;	// Geçerli!

			Console.WriteLine(s);

Aralarında türetme ilişkisi olmayan iki sınıf arasında, tür dönüştürme operatörüyle bile dönüştürme yapılsa derleme aşamasında error oluşur. Çünkü böyle bir dönüştürmenin haklı olabilme olasılığı yoktur. Yani kontrolün çalışma zamanına bırakılmasına gerekte yoktur. Örneğin Sample ve Test herhangi iki sınıf olsun;

using System;

namespace CSD
{
	class App
	{
		public static void Main()
		{
			Sample s = new Sample();
			Test t;

			t = (Test)s; 
			// Derleme aşamasında error!

		}

		class Sample
		{
			//...
		}
		class Test
		{
			//...
		}

	}
}

Kaynak:Kaan Aslan Hocanın Dersinde Tuttuğum Ders Notlarıdır.


So, what do you think ?