3、C#面向對象:封裝、繼承、多態、String、集合、文件(下),
面向對象多態
一、裝箱和拆箱
裝箱:將值類型轉換為引用類型。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