【C#】之里氏轉換
阿新 • • 發佈:2018-12-08
前面說到了繼承,子類可以繼承父類的屬性和方法,但是父類也有自己特有的子類不能用的屬性和方法,當子類想要呼叫父類中的一些特有的屬性或方法是,就用到了里氏轉換,即將子類通過轉換變成父類,使用父類中的特有屬性和方法後在返回為子類。
#一、里氏轉換可能出現的四種情況
##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這個子類