3、C#面向对象:封装、继承、多态、String、集合、文件(下)
面向?qū)ο蠖鄳B(tài)
一、裝箱和拆箱
裝箱:將值類型轉(zhuǎn)換為引用類型。object o = 1;值類型給引用類型賦值
拆箱:將引用類型轉(zhuǎn)換為值類型。int n = (int)o; 強(qiáng)制轉(zhuǎn)換為值類型
滿足條件:兩種類型是否存在繼承關(guān)系。
int n = Convert.ToInt32("12"); 未發(fā)生裝箱或拆箱 。int存儲(chǔ)在棧,string存儲(chǔ)在堆
裝箱或拆箱會(huì)影響程序運(yùn)行事件。
二、面向?qū)ο蠖鄳B(tài)
對(duì)象在調(diào)用同一個(gè)方法的時(shí)候表現(xiàn)出來(lái)多種狀態(tài)。
1、虛方法
將父類的方法標(biāo)記為虛方法使用關(guān)鍵字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()); //調(diào)用的方法時(shí)取決于自己是什么對(duì)象Response.Write(p[1].SayHi()); }public class person {public virtual string SayHi() //父類方法使用virtual表示該方法是虛方法 {return "人類";} }public class chinese : person {public override string SayHi() //子類方法使用override表示該方法是重寫虛方法 {return "中國(guó)人";} }public class jpan : person {public override string SayHi() // override {return "日本人";} }?
2、抽象類
當(dāng)父類中的方法不知道如何去實(shí)現(xiàn)的時(shí)候,可以考略將父類寫成抽象類,將方法寫成抽象方法。
使用abstract定義的類為抽象類,使用abstract定義的方法為抽象方法,抽象函數(shù)是沒(méi)有方法體的。
抽象類無(wú)法實(shí)例化父類,直接實(shí)例化子類調(diào)用。
父類方法中有意義時(shí)使用虛方法,父類方法中方法無(wú)意義時(shí)使用抽象類。
protected void Page_Load(object sender, EventArgs e) {//抽象類不能被實(shí)例化 只能實(shí)例化子類對(duì)象xingzhuang y = new yuan(5);double mianji = y.mianji();double zhouchang = y.zhouchang();Response.Write("半徑為5的原型面積為:" + mianji + ",周長(zhǎng):" + zhouchang);xingzhuang ju = new juxing(10, 20);double mianji1 = ju.mianji();double zhouchang1 = ju.zhouchang();Response.Write("高為10的寬為20的矩形面積為:" + mianji1 + ",周長(zhǎng):" + zhouchang1); }public abstract class xingzhuang //被標(biāo)記為abstract的類稱為抽象類 {public string Name { get; set; } //抽象類中可以包含實(shí)例成員,并且實(shí)力成員可以不被子類實(shí)現(xiàn)。public abstract double mianji(); //抽象方法必須標(biāo)記為abstract,并且不能有任何實(shí)現(xiàn),必須在抽象類中。public abstract double zhouchang(); //抽象成員的訪問(wèn)修飾符不能是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;} }三、簡(jiǎn)單工廠設(shè)計(jì)模式
class Program {static void Main(string[] args){while (true){Console.WriteLine("請(qǐng)輸入要進(jìn)入的磁盤");string path = Console.ReadLine();Console.WriteLine("請(qǐng)輸入要進(jìn)入的文件");string fileName = Console.ReadLine();FileFather f = getFile(fileName, path + fileName);f.OpenFile(); //打開一個(gè)文件取決于輸入一個(gè)什么文件 Console.ReadKey();}}public static FileFather getFile(string fileName, string fullName) //簡(jiǎn)單工廠形式返回父類 {string ext = Path.GetExtension(fileName);FileFather f;switch (ext){case ".txt":f = new txtPath(fullName);break;case ".jpg":f = new jpgPath(fullName);break;default:f = null;break;}return f;} }public abstract class FileFather //抽象父類 {public string fileName { get; set; } //文件全路徑public FileFather(string fileName) //構(gòu)造函數(shù) 自己不能用 {this.fileName = fileName;}public abstract void OpenFile(); //抽象方法 }public class txtPath : FileFather {public txtPath(string fileName) //繼承父類構(gòu)造函數(shù): base(fileName){}public override void OpenFile() //子類重寫 {ProcessStartInfo psi = new ProcessStartInfo(fileName);//使用進(jìn)程打開指定文件Process pro = new Process();pro.StartInfo = psi;pro.Start();} }public class jpgPath : FileFather {public jpgPath(string fileName): base(fileName){}public override void OpenFile(){ProcessStartInfo psi = new ProcessStartInfo(fileName);Process pro = new Process();pro.StartInfo = psi;pro.Start();} }四、值傳遞和引用傳遞
值類型:int double char decimal bool enum struct 存儲(chǔ)于棧
引用類型:string 數(shù)組 自定義類 集合 object 接口 存儲(chǔ)于堆
值傳遞:int n1 = 10; n2 = n1; n2 = 20; 值類型在賦值的時(shí)候,傳遞的是這個(gè)值的本身,復(fù)制了一份。 p1 = 10 ; p2 = 20;
引用傳遞:p1.name = "3"; p2.name = p1.name; p2.name="4"; 引用類型在賦值的時(shí)候,傳遞的是這個(gè)值的引用,引用同一份,p1 p2 指向同一塊內(nèi)存。
五、序列化和反序列化
序列化:將對(duì)象轉(zhuǎn)換為二進(jìn)制
反序列化:將二進(jìn)制轉(zhuǎn)換為對(duì)象
作用:傳輸數(shù)據(jù)。
1、將這個(gè)類標(biāo)記為可以被序列化 [Serializable]。
2、使用BinaryFormatter開始序列化對(duì)象。
protected void Page_Load(object sender, EventArgs e) {//將P傳輸給對(duì)方電腦person p = new person();p.name = "張三";p.age = 18;p.gender = '男';using (FileStream sw = new FileStream(@"d:\11.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))//序列化到目標(biāo)文件 {//開始序列化對(duì)象BinaryFormatter bf = new BinaryFormatter();bf.Serialize(sw, p); //要被序列化的對(duì)象 sw.Write 自動(dòng)完成 }person per = new person();//接收對(duì)方發(fā)過(guò)來(lái)的二進(jìn)制 反序列化對(duì)象using (FileStream sr = new FileStream(@"d:\11.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)){BinaryFormatter bf1 = new BinaryFormatter();per = (person)bf1.Deserialize(sr);}Response.Write(per.name + per.age + per.gender); }[Serializable] //將這個(gè)類標(biāo)記為可被序列化 public class person {public string name { get; set; }public int age { get; set; }public char gender { get; set; } }六、部分類partial
局部類型允許我們將一個(gè)類、接口或結(jié)構(gòu)分成好幾個(gè)部分,分別實(shí)現(xiàn)在幾個(gè)不同的.cs文件中
public partial class person
{
}
public partial class person
{
}
1)類型特別大,不宜放在一個(gè)文件中實(shí)現(xiàn)。
2)需要多人合作編寫一個(gè)類。
七、密封類sealed
密封類用sealed修飾,不能被繼承。因此,它也不能是抽象類。
重寫ToString()
子類重寫父類的虛方法
public override string ToString(){ return "sd";}
八、接口interface
接口是一種規(guī)范,是一個(gè)引用類型,因?yàn)槔^承只能繼承一個(gè),所以通過(guò)接口可以實(shí)現(xiàn)多重繼承。
只要一個(gè)類繼承了一個(gè)接口,這個(gè)類就必須實(shí)現(xiàn)接口的所有成員。
接口不能實(shí)例化,不能被new。
在聲明接口成員的時(shí)候,不準(zhǔn)為接口成員編寫具體的可執(zhí)行代碼.
接口與接口之間可以繼承,可以多繼承,接口不能繼承類。
接口成員不能有static、abstract、override、virtual修飾符,使用new修飾符不會(huì)報(bào)錯(cuò),但會(huì)給出警告說(shuō)不需要關(guān)鍵字new。
一個(gè)類繼承了接口又繼承了類,語(yǔ)法上必須先繼承類,再繼承接口
public interface IFly {//成員不允許添加訪問(wèn)修飾符,默認(rèn)就是publicstring name { get; set; } //接口可以有方法、屬性、所引器。void Fly(); //不可以有方法體 }public class father {}public class person : father, IFly //先寫類 后寫接口 {public string name { get; set; }public void Fly(){} }顯示接口
?
//用來(lái)解決方法重名問(wèn)題 class Program {static void Main(string[] args){Ifly fly = new Birad();fly.Fly(); //接口的Briad bid = new Briad();bid.Fly(); //自己的 } }public class Birad : Ifly //鳥類繼承接口ifly {public string Fly() //類自己的方法 {return "fly";}public string Ifly.Fly(){ //接口的方法return "ifly11111";} }public interface Ifly //定義接口 fly方法 {string Fly(); }?
九、異常與異常處理
try {int number = 10; //可能出錯(cuò)的代碼塊 }catch (Exception ex) {Console.WriteLine(ex.Message);//錯(cuò)誤信息throw new Exception("錯(cuò)誤"); //拋出異常 }1、什么時(shí)候用虛方法實(shí)現(xiàn)多態(tài)?
可以提取出一個(gè)父類,需要寫出明方法時(shí)。
2、什么時(shí)候用抽象類實(shí)現(xiàn)多態(tài)?
可以提取出一個(gè)父類,但是不知道具體怎么實(shí)現(xiàn)時(shí)。
3、什么時(shí)候用接口來(lái)實(shí)現(xiàn)多態(tài)?
無(wú)法提取出一個(gè)父類,但是都有一個(gè)共同的行為,或者需要多重繼承時(shí)。
轉(zhuǎn)載于:https://www.cnblogs.com/baidawei/p/4702526.html
總結(jié)
以上是生活随笔為你收集整理的3、C#面向对象:封装、继承、多态、String、集合、文件(下)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 总结2010展望2011
- 下一篇: 手机内置天线慎用FPC