面向對象多態
一、裝箱和拆箱
裝箱:將值類型轉換為引用類型。object o = 1;值類型給引用類型賦值
拆箱:將引用類型轉換為值類型。int n = (int)o; 強制轉換為值類型
滿足條件:兩種類型是否存在繼承關系。
int n = Convert.ToInt32("12"); 未發生裝箱或拆箱 。int存儲在棧,string存儲在堆
裝箱或拆箱會影響程序運行事件。
二、面向對象多態
對象在調用同一個方法的時候表現出來多種狀態。
1、虛方法
將父類的方法標記為虛方法使用關鍵字virtual,可以被子類重新寫一遍
protected void Page_Load(object sender, EventArgs e) { person[] p = new person[2]; chinese p1 = new chinese(); jpan p2 = new jpan(); p[0] = p1; p[1] = p2; Response.Write(p[0].SayHi()); //調用的方法時取決於自己是什麼對象 Response.Write(p[1].SayHi()); } public class person { public virtual string SayHi() //父類方法使用virtual表示該方法是虛方法 { return "人類"; } } public class chinese : person { public override string SayHi() //子類方法使用override表示該方法是重寫虛方法 { return "中國人"; } } public class jpan : person { public override string SayHi() // override { return "日本人"; } }
2、抽象類
當父類中的方法不知道如何去實現的時候,可以考略將父類寫成抽象類,將方法寫成抽象方法。
使用abstract定義的類為抽象類,使用abstract定義的方法為抽象方法,抽象函數是沒有方法體的。
抽象類無法實例化父類,直接實例化子類調用。
父類方法中有意義時使用虛方法,父類方法中方法無意義時使用抽象類。
protected void Page_Load(object sender, EventArgs e) { //抽象類不能被實例化 只能實例化子類對象 xingzhuang y = new yuan(5); double mianji = y.mianji(); double zhouchang = y.zhouchang(); Response.Write("半徑為5的原型面積為:" + mianji + ",周長:" + zhouchang); xingzhuang ju = new juxing(10, 20); double mianji1 = ju.mianji(); double zhouchang1 = ju.zhouchang(); Response.Write("高為10的寬為20的矩形面積為:" + mianji1 + ",周長:" + zhouchang1); } public abstract class xingzhuang //被標記為abstract的類稱為抽象類 { public string Name { get; set; } //抽象類中可以包含實例成員,並且實力成員可以不被子類實現。 public abstract double mianji(); //抽象方法必須標記為abstract,並且不能有任何實現,必須在抽象類中。 public abstract double zhouchang(); //抽象成員的訪問修飾符不能是private } public class yuan : xingzhuang { public double R { get; set; } public yuan(double r) { this.R = r; } public override double mianji() //子類繼承抽象類後必須把父類中所有抽象成員重寫 { return Math.PI * this.R * this.R; } public override double zhouchang() //子類繼承抽象類後必須把父類中所有抽象成員重寫 { return 2 * Math.PI * this.R; } } public class juxing : xingzhuang { public double width { get; set; } public double height { get; set; } public juxing(double height, double width) { this.height = height; this.width = width; } public override double mianji() //子類繼承抽象類後必須把父類中所有抽象成員重寫 { return this.height * this.width; } public override double zhouchang() //子類繼承抽象類後必須把父類中所有抽象成員重寫 { return (this.height + this.width) * 2; } } View Code