1. 程式人生 > >【C#】之里氏轉換

【C#】之里氏轉換

前面說到了繼承,子類可以繼承父類的屬性和方法,但是父類也有自己特有的子類不能用的屬性和方法,當子類想要呼叫父類中的一些特有的屬性或方法是,就用到了里氏轉換,即將子類通過轉換變成父類,使用父類中的特有屬性和方法後在返回為子類。

#一、里氏轉換可能出現的四種情況
##1、

//如果new 後面的是子類,子類變成父類呼叫父類方法之後,再轉換成原來子類可以成功		
Person  p = new Teacher();
Teacher t = (teacher)p;  //強制轉換成功
t.SayHi(); 

##2、

//如果new 後面是子類,子類變成父類呼叫父類方法之後,轉換成另一個子類 會報異常		
Person p = new Teacher();
Student stu = (student)p; //強制轉換失敗
Stu.SayHello();

##3、

//父類物件不能直接轉換成子類		
Person p = new Person();
Student stu = (Student)p; //強制轉換失敗
Stu.SayHello();

##4、

//子類轉換成父類可以直接隱式轉換		
Student stu = new Student();
Person p = stu; //直接隱式轉換
p.Show();

#二、除錯
上面的四種情況程式碼書寫都沒有錯誤,但是在執行時,第二種和第三種會報異常,為了解決這樣的問題,出現了裡式轉換中的is和as判斷:

TypeA  is type B 僅判斷                            //返回的是bool型別
TypeA as TypeB 先判斷,再轉換           //返回的是一個型別

as轉換如果轉換不成功,不會報異常,返回來的是null
is轉換,返回的是bool型,true就是能進行轉換,false不能轉換

例:

	//1、
	Person p = new Student();
	Bool result = p is Teacher; //判斷p是否能夠轉換成teacher這個子類
	If (result)
	{
		Teacher t = (Teacher)p;
		t.SayHi();
	}
	Else
	{
		Console.writeline("無法轉換");
	}
	//2、
	Person p = new Student();
	Teacher t = p as Teacher; //p轉換成teacher這個子類