1. 程式人生 > >C#向上轉型和向下轉型

C#向上轉型和向下轉型

子類物件賦給父類型別的變數,稱為向上轉型。
父類型別的物件賦給子類型別的變數,稱為向下轉型。

上個例子,Vegetable是父類,Potato是子類。

namespace ConsoleApplication1
{
class Vegetable {
public virtual void show()
{ System.Console.WriteLine("I am vegatable."); }
}

class Potato : Vegetable {
public override void show()
{ System.Console.WriteLine("I am Potato."); }
}


class Program
{
static void Main(string[] args)
{
Potato p1 = new Potato();
Vegetable v1 = p1; //向上轉型
v1.show(); //呼叫的是Patato.show()方法


Vegetable v2 = new Vegetable();
//Potato p2 = (Potato)v2; //向下轉型,v2是指向一個Vegetable物件,編譯期通過,執行期出錯
Potato p3 = (Potato)v1; //向下轉型,v1實際是指向一個Potato物件,執行期正確
p3.show(); //呼叫的也是Patato.show()方法。
}
}
}

總結:
1)對於自定義類而言,向上轉型是C#語言提供的機制。
2)向下轉型是形式上的,本質上父類物件是無法轉為子類物件的,除非這個所謂的父類物件是之前從子類物件向上轉型而來。
3)向下轉型語法上要強制型別轉換,和其他強制型別轉換一樣,轉換是否成功只能在執行期判斷。
4)向上轉型和向下轉型是理解C#協變和抗變的基礎。