C#面向?qū)ο笳n件_第1頁
C#面向?qū)ο笳n件_第2頁
C#面向?qū)ο笳n件_第3頁
C#面向?qū)ο笳n件_第4頁
C#面向?qū)ο笳n件_第5頁
已閱讀5頁,還剩133頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

面向?qū)ο?Microsoft.NET介紹微軟的.NET歷史2000年微軟公司向全球宣布其革命性的軟件和服務(wù)平臺:Microsoft.NET

2001年發(fā)布了.NETFramework1.0版經(jīng)歷5個版本1.0、1.1、2.0、3.0、3.5Microsoft.NET介紹支持多種終端平臺信息互聯(lián)互通Web服務(wù):Passport,MSN在線游戲Live服務(wù)任何時候、任何地方、利用任何工具都可以獲得網(wǎng)絡(luò)上的信息,并享受網(wǎng)絡(luò)通信所帶來的快樂.NET戰(zhàn)略對微軟的影響2003~2004年間,全球100強(qiáng)和《財富》100強(qiáng)加起來的共166個公司微軟發(fā)布.NET前后的營業(yè)額Microsoft.NET介紹為什么需要.NET框架不同平臺(PDA、PC、游戲機(jī))的程序如何在.NET環(huán)境下運(yùn)行?使用C#的程序可以調(diào)用VB.NET開發(fā)的程序嗎?.NETFramework.NET框架概述.NET框架.NET戰(zhàn)略的基礎(chǔ)框架便捷的開發(fā)平臺強(qiáng)大的類庫.NET程序的運(yùn)行環(huán)境.NET框架公共語言運(yùn)行時框架類庫兩個主要組件.NET框架的魅力面向?qū)ο缶幊烫岣哕浖蓮?fù)用、可擴(kuò)展、易維護(hù)性、靈活性強(qiáng)大的動態(tài)Web支持Web服務(wù)Passport服務(wù)MSN,Hotmail都通過PassportWeb服務(wù)驗(yàn)證世界級開發(fā)工具VisualStudio2005框架體系結(jié)構(gòu).NET框架的核心操作系統(tǒng)公共語言運(yùn)行庫(CLR)VC++.NETC#VB.NETVJ#….NETFramework類庫(FCL)框架組件基本框架類Web窗體WebServiceWinFormsADO.NET和XML類.NETFramework.NETFramework類庫ASP.NETCLSCLRCTS無論是WinForms和ASP.NET都可以使用ADO.NET與基類庫公共語言運(yùn)行時CLR稱為公共語言運(yùn)行時C#VB.NET代碼被執(zhí)行MSILCLR通用語法,計算機(jī)不用了解CLR執(zhí)行ILC#編譯器VB.NET編譯器公共語言運(yùn)行時CTS和CLS是CLR的子集CTS(通用類型系統(tǒng))定義了在IL中的的數(shù)據(jù)類型VB.NET的Integer和C#的int型都被編譯成Int32CLS(公共語言規(guī)范)CLR支持的語言功能的子集,包括幾種面向?qū)ο蟮木幊陶Z言的通用功能框架類庫提供對系統(tǒng)功能的訪問建立.NET應(yīng)用程序,組件和控件的基礎(chǔ)龐大的類庫數(shù)量170多個命名空間,上千個類功能齊全,方便使用對文件的基本操作對網(wǎng)絡(luò)的訪問安全控制對圖形的操作…….NET平臺全新的語言配合革命性平臺,誕生了C#C#之父AndersHejlsberg曾工作于Borland公司Pascal和Delphi之父1996年赴微軟,當(dāng)時年薪300W$.NET平臺全新的語言C#是一種簡單、現(xiàn)代、面向?qū)ο缶幊陶Z言目前經(jīng)歷了三個版本1.0、2.0、3.0我們學(xué)習(xí)的是2.0、3.0Anders自定義命名空間如果在一個項(xiàng)目中,編寫了兩個功能不同但名字相同的類,就會發(fā)生沖突,如何解決沖突?重新命名類名namespaceMySchool{publicclassStudent{}}namespaceYourSchool{publicclassStudent{}}不同的命名空間使用命名空間嵌套命名空間回顧:命名空間用于組織相關(guān)類和其他類型與Java的package相似嵌套命名空間namespaceCity{namespaceMySchool{namespaceClass{classStudent{//此處編寫代碼}}}}引用命名空間:usingCity.MySchool.Class;使用別名如果命名空間的名字非常的長給這個嵌套的命名空間指定一個簡潔的名字City.MySchool.Classusinguser=City.MySchool.Class;//…namespaceMySchool{classStudent{

user.Studentstu=newuser.Student();}}別名使用別名對象對象是人們要進(jìn)行研究的任何事物

顏色:灰色

排量:3.0剎車產(chǎn)地:德國行駛名字:保時捷行為狀態(tài)

顏色:紅色

排量:4.0剎車產(chǎn)地:意大利行駛名字:法拉利行為狀態(tài)回顧Java的對象,描述汽車的特征和行為有各自不同的狀態(tài)類和對象小汽車

顏色:灰色

排量:3.0

剎車產(chǎn)地:德國行駛名字:保時捷行為狀態(tài)類的實(shí)例化,是由類具體化對象類產(chǎn)地車體顏色行駛剎車…歸納一組相似對象的共性對象屬性方法類描述一組相似對象的共性類和對象的應(yīng)用類和對象的簡單應(yīng)用//…Carferrari=NewCar();ferrari.Run();//…類對象實(shí)例化對象調(diào)用方法publicclassStudent{intage=26;

//姓名

privatestringname;publicstringName{get{returnname;}set{name=value;}}//問候publicvoidSayHi(){ …}}類和類的成員類的成員字段屬性方法…

類名自定義一個類classDBHelper{//數(shù)據(jù)庫連接字符串privatestaticstringconnString="

…";//數(shù)據(jù)庫連接Connection對象publicstaticSqlConnectionconnection=newSqlConnection(connString);}訪問修飾符私有公有公有成員和私有成員classstudent{

privatestringname;//姓名

publicintage;//年齡

publicstringidNumber

;//身份證號}…staticvoidMain(string[]args){studentmyStudent=newstudent();

myS="張三";

myStudent.age=20;

}私有成員公有成員實(shí)例化一個對象可以訪問無法訪問編譯錯誤

數(shù)據(jù)安全staticvoidMain(string[]args){studentmyStudent=newstudent();myStudent.age=-2;myStudent.idNumber="123456";

}非法數(shù)據(jù)身份證號不能被修改無法獲得數(shù)據(jù)無法正常賦值有時候?qū)㈩愔械淖侄喂_是不安全的如果設(shè)為私有成員能否對這些字段進(jìn)行規(guī)則約束或者只讀呢?在類中使用屬性privateintage;//年齡publicintAge{get{returnage;}set{if(value>0&&value<100){age=value;}else{age=18;}}}myStudent.Age=-20;//打印…myStudent.Age=40;//打印…沒有訪問age公開Age錄入非法數(shù)據(jù)打印私有變量age不公開age通過公有Age訪問和約束私有字段age什么是屬性C#不直接訪問類的數(shù)據(jù)通過訪問器訪問(get,set)classStudent{

//姓名

privatestringname;publicstringName{get{returnname;}set{name=value;}}}返回nameget用于獲取相應(yīng)字段的值set用于設(shè)置字段的值只有g(shù)et時:只讀屬性只有set時:只寫屬性get和set都存在:讀寫屬性屬性的類型和字段類型必須一致給name賦值屬性的特點(diǎn)privateintage;//年齡publicintAge{get{returnage;}set{if(value>0&&value<100){age=value;}else{age=18;}}}控制私有字段的可訪問性保護(hù)內(nèi)部數(shù)據(jù)的安全建議:類內(nèi)部敏感字段使用屬性來控制訪問類型可以是各種數(shù)據(jù)類型,如:對象、數(shù)組等等封裝字段將類中的字段、屬性綁到一起封裝字段封裝是面向?qū)ο蟮娜筇匦灾槐苊夥欠〝?shù)據(jù)的訪問保證數(shù)據(jù)的完整性演示:在VS中使用重構(gòu)——封裝字段在類中使用方法方法是類或?qū)ο蟮男袨閷ο笮枰瞿承┦虑?,在類中添加方法回顧方法的定義訪問修飾符返回類型方法名(參數(shù)列表){//方法的主體…}通過return返回值如果返回類型是void,方法是否需要返回值?方法的參數(shù)參數(shù)傳遞使用值傳遞,參數(shù)值的更改不能保留使用ref可以將參數(shù)值的更改保留out類型參數(shù)privatestaticvoidAddScore(ref

intscore,outintscoreResult){

if(score>50&&score<60){Console.WriteLine("你的成績在50-60之間,可以加分。");score=60;}scoreResult=score;}都可以輸出結(jié)果ref側(cè)重修改,out側(cè)重輸出不能寫成AddScore(outintscoreResult)方法的使用實(shí)現(xiàn)兩個整型的加法classAdd{

publicintSum(intpara1,intpara2){returnpara1+para2;}}AddmyAdd=newAdd();intsum=myAdd.Sum(2,3);使用方法實(shí)例化一個對象返回結(jié)果調(diào)用方法靜態(tài)方法classmySwap{publicstaticvoidSintnum1,refintnum2){inttemp;temp=num1;num1=num2;num2=temp;}}classProgram{staticvoidMain(string[]args){intnum1=5,num2=10;myS(refnum1,refnum2);}}回顧一下,Swap方法在另一類中如何調(diào)用?靜態(tài)方法使用類名調(diào)用靜態(tài)方法靜態(tài)方法和實(shí)例方法使用static修飾的方法稱為靜態(tài)方法使用實(shí)例對象調(diào)用的方法叫做實(shí)例方法靜態(tài)方法實(shí)例方法static關(guān)鍵字不需要static關(guān)鍵字使用類名調(diào)用使用實(shí)例對象調(diào)用可以訪問靜態(tài)成員可以直接訪問靜態(tài)成員不可以直接訪問實(shí)例成員可以直接訪問實(shí)例成員不能直接調(diào)用實(shí)例方法可以直接訪問實(shí)例方法、靜態(tài)方法調(diào)用前初始化實(shí)例化對象時初始化為什么要重載

publicintSum(intpara1,intpara2){returnpara1+para2;}整型參數(shù),返回值整型如果想讓兩個string型、兩個double型相加,怎么做?編寫兩個不同名字的方法,這樣我們在進(jìn)行調(diào)用時要先判斷是什么類型,能否不判斷直接就能相加呢?方法的重載同一個類中添加幾個名字相同,參數(shù)與返回值不同的方法

publicstringSum(stringpara1,stringpara2){returnpara1+para2;}

publicdoubleSum(doublepara1,doublepara2){returnpara1+para2;}調(diào)用時只要傳遞參數(shù)即可,無需判斷類型classAdd{

publicstringSum(stringpara1,stringpara2){…}publicintSum(intpara1,intpara2){…}}重載的方式基于不同類型參數(shù)的重載classAdd{

publicintSum(intpara1,intpara2){…}publicintSum(intpara1,intpara2,intpara3){…}}相同類型不同參數(shù)個數(shù)的重載不允許重載方法僅僅是返回值不同Studentzhang=newStudent();zhang.Name="張靚靚";zhang.Age=20;zhang.Hobby="唱歌歌";一種特別的方法班級來了新學(xué)員添加學(xué)員對象學(xué)員類實(shí)例化對象、設(shè)置屬性初始屬性若太多,設(shè)置麻煩能否在實(shí)例化時設(shè)置屬性?publicStudent(stringname,intage,stringhobby){this.Name=name;this.Age=age;this.Hobby=hobby;}Studentzhang=newStudent("張靚靚",20,"唱歌歌");一次設(shè)置完成類中加入這個方法添加的方法叫做構(gòu)造函數(shù)構(gòu)造函數(shù)是類中的一種特殊的方法構(gòu)造函數(shù)名與類名相同,不返回任何值可初始化成員變量classStudent{

publicStudent(stringname,intage,stringhobby){this.Name=name;this.Age=age;this.Hobby=hobby;}}初始化成員變量this關(guān)鍵字引用類的當(dāng)前實(shí)例將參數(shù)的值,分別賦給當(dāng)前實(shí)例的屬性使用構(gòu)造函數(shù)new

關(guān)鍵字可以實(shí)例化一個新的對象指定對某個帶參數(shù)的構(gòu)造函數(shù)Studentzhang=newStudent("張靚靚",20,"唱歌歌");每次創(chuàng)建類的實(shí)例都會調(diào)用此方法實(shí)例化對象調(diào)用構(gòu)造函數(shù)使用new關(guān)鍵字Studentscofield=newStudent();Studentzhang=newStudent("張靚靚",20,"唱歌歌");實(shí)例化一個對象實(shí)例化一個新對象publicStudent(){}publicStudent(stringname,intage,stringhobby){=name;this.age=age;this.hobby=hobby;}構(gòu)造函數(shù)的重載構(gòu)造函數(shù)也可以重載Studentscofield=newStudent();Studentzhang=newStudent("張靚靚",20,"唱歌歌");方法名相同,參數(shù)不同privateinta;publicintA{get{returna;}set{a=value;}}你喜歡讀哪段代碼?合格的程序要符合編碼規(guī)則直觀易于理解、有意義的單詞方便維護(hù)有利于調(diào)試編碼規(guī)則的必要性如name,age,studentprivateintname;publicintName{get{returnname;}set{name=value;}}無法理解是什么為什么使用常量publicclassCompute{doublepi=3.14;//計算圓的周長publicdoublePerimeter(doubleradius){return2*pi*radius;}//計算圓的面積publicdoubleArea(doubleradius){returnpi*radius*radius;}}這個類中,會反復(fù)使用pi如果pi在類中被修改了,計算結(jié)果錯誤如何避免pi在類中被修改?常量常量在使用過程中值不會發(fā)生變化常量程序中反復(fù)使用const類型常量名=常量值程序中不會被改變staticvoidMain(string[]args){

constintPI=3.14;

PI=3.20;}強(qiáng)制賦值會發(fā)生錯誤常量名通常使用大寫隨意賦值的危險conststringGENDER_M="男";conststringGENDER_F="女";…//性別privatestringgender;publicstringGender{get{returngender;}set{gender=value;}}用常量給屬性賦值:student.Gender=GENDER_M;也可以這樣給屬性賦值:student.Gender="School";為Student類添加性別的屬性,用常量賦值有違常理,非法數(shù)據(jù)什么是枚舉用一種新的類型定義enumpublicenumGenders{Male,Female}//性別privateGendersgender;publicGendersGender{get{returngender;}set{gender=value;}}這樣給屬性賦值:student.Gender=Genders.Male;如果這樣屬性賦值:student.Gender="School";類型不同不能賦值性別屬性的類型Genders是一個枚舉類型代碼錯誤枚舉定義枚舉是一組描述性的名稱枚舉定義一組有限的值,不能包含方法對可能的值進(jìn)行約束枚舉允許描述性名稱表示整數(shù)值訪問修飾符enum枚舉名{值1,值2…}publicenumSchool{T1,T2,T3}publicenumSchool{T1=1,T2=2,T3=3}//……Console.WriteLine(“T2的整數(shù)值是{0}.",(int)(School.T2));取得枚舉表示的整數(shù)值枚舉與其它類型的轉(zhuǎn)換枚舉轉(zhuǎn)換為字符串字符串轉(zhuǎn)換為枚舉publicenumSchool{T1,T2,T3}//……Console.WriteLine(“T2的值是{0}.",School.T2.ToString());(School)(Enum.Parse(typeof(School),“T2");需要轉(zhuǎn)換的字符串枚舉的特點(diǎn)汽車類有一個成員是車身顏色staticvoidMain(string[]args){string[]color=newstring[]{"red","black","write"};Console.WriteLine("我要選擇的顏色是:{0}",color[0]);}使用時,必須了解數(shù)組的構(gòu)成枚舉可以用描述性的名稱表示值,使用時無需了解它的構(gòu)成privateenumcolor{red,write,black}staticvoidMain(string[]args){Console.WriteLine("我要選擇的顏色是:{0}",color.red);}枚舉枚舉的典型應(yīng)用DialogResultchoice;choice=MessageBox.Show("確定要退出嗎?","退出系統(tǒng)",MessageBoxButtons.OKCancel,MessageBoxIcon.Information);if(choice==DialogResult.OK)Application.Exit();DialogResult是個枚舉,指示對話框的返回值這樣我們就不會判斷一些非法的值,導(dǎo)致系統(tǒng)異常為什么需要結(jié)構(gòu)有很多預(yù)定義顏色正常人眼可分辨的顏色種類可達(dá)幾十萬種以上Color提供使用RGB值返回顏色的方法FromArgb()

System.Drawing.Color有很多顏色值,它是一個枚舉嗎?System.Drawing.Color是一個結(jié)構(gòu)

結(jié)構(gòu)定義結(jié)構(gòu)中有屬性,也可以有方法publicstructStructStudent{publicstringName;publicintAge;publicstringHobby;publicintPopularity;publicvoidSayHi(){//….}}訪問修飾符struct結(jié)構(gòu)名{定義結(jié)構(gòu)成員}構(gòu)成和類相似定義成員變量不能賦初值成員方法//…StructStudentmyStu;myStu.Age=20;myStu.Gender=Genders.Female;myStu.Hobby="唱歌歌";myStu.Name="張靚靚";myStu.Popularity=100;myStu.SayHi();//…結(jié)構(gòu)的使用2-1定義結(jié)構(gòu)可以不用new為結(jié)構(gòu)成員賦值調(diào)用結(jié)構(gòu)的方法運(yùn)行結(jié)果和第二章的SayHi相同//…

StructStudentmyStu=newStructStudent("張靚靚",Genders.Female,20,"唱歌歌",100);myStu.SayHi();//…結(jié)構(gòu)的使用2-2structStructStudent{//…publicStructStudent(stringname,Gendersgender,intage,stringhobby,intpopularity){this.Name=name;this.Gender=gender;//…}}可以有構(gòu)造函數(shù)只能聲明有參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù)傳參理解結(jié)構(gòu)與類的區(qū)別都可以實(shí)現(xiàn)接口都可以包含字段、方法相同點(diǎn)結(jié)構(gòu)中給字段賦值是錯誤的類中可以給字段賦值創(chuàng)建對象可以不用new創(chuàng)建對象必須使用new可以添加構(gòu)造函數(shù),但它們必須帶參數(shù)可以添加無參的構(gòu)造函數(shù)不可以有默認(rèn)構(gòu)造函數(shù)可以有默認(rèn)構(gòu)造函數(shù)不能被繼承可以被繼承值類型引用類型不同點(diǎn)結(jié)構(gòu)類

值類型與引用類型使用類版Student和結(jié)構(gòu)版Student實(shí)現(xiàn)下面操作staticvoidMain(string[]args){//使用值類型StructStudentstudent1=newStructStudent();StructStudentstudent2=newStructStudent();student1.Age=18;student2=student1;student2.Age=20;Console.WriteLine("student1={0},student2={1}",student1.Age,student2.Age);}staticvoidMain(string[]args){//使用引用類型Studentstudent1=newStudent();Studentstudent2=newStudent();student1.Age=18;student2=student1;student2.Age=20;Console.WriteLine("student1={0},student2={1}",student1.Age,student2.Age);}值類型值類型直接存儲值A(chǔ)ge=18student1student1studnet2student1.Age=18Age=18Age=18student2=student1student1.Age

student1studnet2Age=18Age=20student2.Age=20引用類型student1student1.Age=18Age=18引用類型存儲對值的引用student1studnet2student2=student1student1.Age

兩個變量都發(fā)生變化Age=20student1studnet2student2.Age=20拆箱和裝箱值類型和引用類型之間的轉(zhuǎn)換值類型引用類型裝箱拆箱staticvoidMain(string[]args){inti=123;objecto=i;//裝箱

i=456;//改變i的內(nèi)容

Console.WriteLine("值類型的值為{0}",i);Console.WriteLine("引用類型的值為{0}",o);}staticvoidMain(string[]args){inti=123;objecto=i;//裝箱

intj=(int)o;}//拆箱與值類型的變量類型要一致值方式的參數(shù)的傳遞值傳遞方式傳遞值類型:結(jié)構(gòu):StructStudent不會被修改

//傳遞值類型參數(shù)StructStudentscofield=newStructStudent("Scofield",Genders.Male,28,"越獄獄");scofield.SayHi();Vote(scofield);scofield.SayHi();privatevoidVote(StructStudentstu){stu.Popularity++;}人氣屬性加1的方法人氣加1兩次的人氣值相同,參數(shù)未發(fā)生變化值傳遞值方式的參數(shù)的傳遞值傳遞引用類型時:類:Student參數(shù)在程序中被修改

//傳遞引用類型參數(shù)Studentscofield=newStudent("Scofield",Genders.Male,28,"越獄獄");scofield.SayHi();Vote(scofield);scofield.SayHi();引用類型:類人氣屬性加1的方法人氣加1引用方式傳遞傳遞值類型傳遞引用類型ref方式傳遞完全修改privatevoidVote(refStructStudentstu){stu.Popularity++;}ref引用方式傳遞參數(shù)值類型和引用類型細(xì)分?jǐn)?shù)組:int[],string[]數(shù)組接口:interface接口自定義類:class字符串:string基類:System.Object類引用類型結(jié)構(gòu):struct結(jié)構(gòu)類型枚舉:enum枚舉類型布爾型:bool字符型:char浮點(diǎn)型:float長整型:long整型:int基本數(shù)據(jù)類型值類型描述類別傳遞數(shù)組數(shù)組是值類型還是引用類型//…int[]odd={1,3,5};PrintArray(odd);ChangeToEven(odd);PrintArray(odd);//…privatevoidChangeToEven(int[]arr){for(inti=0;i<arr.Length;i++){arr[i]=i*2;}}值方式傳遞arr[0]=1arr[1]=3arr[2]=5arr[0]=0arr[1]=2arr[2]=4參數(shù)被修改數(shù)組是引用類型什么是索引器能否通過姓名訪問學(xué)員?publicStudentthis[intindex]{get{returnstudents[index];}}Students類中添加

//采用索引器的方式MyClassmyClass=newMyClass("T01");myClass.Students[2].SayHi();myClass.Students["周杰杰"].SayHi();…可以按照索引訪問重載的索引器根據(jù)姓名查找學(xué)員索引器的特點(diǎn)DataRow["列名"]DataReader["列名"]數(shù)組屬性只能根據(jù)下標(biāo)(索引)來訪問索引器可以被重載可以使用更靈活的方式訪問,定義訪問方式我們以前用過的索引器類圖VS2005的類圖類圖描述類的結(jié)構(gòu)查看一個類的類圖“鎖”表示私有不同字段有不同的圖標(biāo)通用的類圖-age:int-name:string+Name:string類名Student+SayHi():void“-”表示私有“+”表示公有“:”后是變量類型“:”后是返回類型讀懂類圖是OOP的基本要求代碼冗余對比這兩個類:Student和Teacher加入校長、班主任的類,都需要加入這幾個屬性,代碼冗余年齡、性別、姓名是重復(fù)的如何共用重復(fù)代碼?提取冗余代碼將公共的成員放到一個類中保留自己特有的成員保留自己特有的成員提取后的應(yīng)用classStudent:Person{publicStudent(){}//愛好privatestringhobby;publicstringHobby{get{returnhobby;}set{hobby=value;}}…}1、提取后的Student類只有學(xué)員特有的屬性2、創(chuàng)建一個學(xué)員對象Studentzhang=newStudent();zhang.Name="張靚靚";zhang.Age=20;zhang.Gender=Genders.Female;zhang.Hobby="唱歌歌";公共屬性可以訪問繼承卡車和巴士都是汽車生活中的繼承汽車剎車行駛共有行為:輪子發(fā)動機(jī)共有特征:卸貨拉貨各自行為:載重貨艙各自特征:??空緢笳靖髯孕袨椋狠d客量客艙各自特征:他們共有的特征來自汽車有什么共同特征呢?卡車公共汽車父類和子類在C#中,一個類可以繼承另一個類Person子類繼承父類,父類派生子類學(xué)員和老師類都繼承PersonStudentTeacher子類父類Student類繼承Person類Person類派生Student類子類又叫派生類父類又叫基類classStudent:Person繼承概述繼承需要符合的關(guān)系:is-aStudentisaPerson子類繼承父類的成員子類可以有自己的成員繼承父類的成員自己特有的成員繼承是面向?qū)ο蟮囊粋€重要特性繼承在類圖中的表示繼承的實(shí)際應(yīng)用1班上所有的人都做自我介紹SayHi()學(xué)員大家好,我是某某同學(xué),今年多少歲,喜歡什么老師大家好,我是某某老師,今年多少歲,工作幾年了子類中訪問繼承父類的公共屬性子類特有屬性繼承的實(shí)際應(yīng)用2公共屬性加入父類有獨(dú)自的SayHi()繼承的實(shí)際應(yīng)用3Teacher和Student類都繼承PersonpublicclassStudent:PersonpublicclassTeacher:PersonpublicStudent(stringname,Gendersgender,intage,stringhobby,intpopularity){this.Name=name;this.Age=age;this.Gender=gender;//學(xué)生類擴(kuò)展的屬性

this.Hobby=hobby;this.Popularity=popularity;}構(gòu)造函數(shù)設(shè)置公共屬性與獨(dú)有屬性繼承自父類的公共屬性子類擴(kuò)展的屬性繼承的實(shí)際應(yīng)用4都有不同的SayHi()方法publicvoidSayHi(){//學(xué)生的SayHi}publicvoidSayHi(){//老師的SayHi}創(chuàng)建對象調(diào)用SayHi()Studentzhang=newStudent(…);Teacherjacky=newTeacher(…);zhang.SayHi();jacky.SayHi();學(xué)生調(diào)用自己的SayHi()老師調(diào)用自己的SayHi()base關(guān)鍵字關(guān)鍵字base的作用調(diào)用父類的屬性和方法調(diào)用父類的構(gòu)造函數(shù)publicvoidSayHi(){stringmessage=string.Format("大家好,我是{0}同學(xué),今年{1}歲了,我喜歡{2}!",

base.Name,base.Age,this.hobby);MessageBox.Show(message);}調(diào)用父類的屬性publicStudent(stringname,Gendersgender,intage,stringhobby,intpopularity):base(name,age,gender){//學(xué)生類擴(kuò)展的屬性

this.Hobby=hobby;this.Popularity=popularity;}this.Name=name;this.Age=age;this.Gender=gender;調(diào)用父類的構(gòu)造函數(shù)protected訪問修飾符protected訪問修飾符允許子類訪問protected訪問修飾符不允許其他非子類訪問不可以可以可以protected不可以不可以可以private可以可以可以public其他類子類類內(nèi)部

父類成員如果父類中的某個成員只允許其子類訪問public修飾所有類都可以訪問private修飾子類無法訪問繼承的傳遞性汽車雙層單層小型卡車重型卡車同樣具有汽車的特征繼承的傳遞性卡車公共汽車還可以派生更多的類型繼承的傳遞性添加一個微型卡車類publicclassSmallTruck:Truck{protectedvoidsmallTruckRun(){Console.WriteLine("微型卡車在行駛!");}staticvoidMain(string[]args){SmallTrucksmalltruck=newSmallTruck();smalltruck.vehicleRun();

smalltruck.truckRun();smalltruck.smallTruckRun();}}publicclassTruck:Vehicle繼承關(guān)系父類的父類成員父類的成員傳遞性繼承單根性publicclassCharmingStudent:SportsMan,Musician編譯錯誤C#中子類不能繼承多個父類CharmingStudent

運(yùn)動員音樂家某類學(xué)員是否可以這樣描述?具有兩種人的特征隱式調(diào)用父類的構(gòu)造函數(shù)Person類中去掉了構(gòu)造函數(shù)publicPerson(){}“Person”方法沒有采用“0”個參數(shù)的重載classStudent:Person{publicStudent(){}publicStudent(stringname,Gendersgender,intage,stringhobby,intpopularity)}base()隱式的調(diào)用base()子類的構(gòu)造函數(shù)沒有使用base指明調(diào)用父類哪個構(gòu)造函數(shù)父類要提供無參的構(gòu)造函數(shù)顯示調(diào)用父類的構(gòu)造函數(shù)如果父類沒有無參的構(gòu)造函數(shù)子類構(gòu)造函數(shù)必須指明調(diào)用父類哪個構(gòu)造函數(shù)publicStudent():base("張靚靚",20,Genders.Female){}publicStudent(stringname,Gendersgender,intage,stringhobby,intpopularity):base(name,age,gender){}軟件開發(fā)中的繼承模擬了現(xiàn)實(shí)世界的關(guān)系實(shí)現(xiàn)代碼重用結(jié)構(gòu)更清晰Student愛好…Person姓名年齡…子類更加關(guān)注與子類相關(guān)的行為和狀態(tài)共有屬性由父類負(fù)責(zé)窗口繼承布局發(fā)生調(diào)整,需要同時改變?nèi)齻€窗體,復(fù)雜度增加通過繼承,很好很有效地保持了界面的一致性和共同行為子類窗口按鈕要實(shí)現(xiàn)不同的功能訪問修飾符應(yīng)該設(shè)置為protected回顧繼承Person類老師

學(xué)員SayHi()SayHi()繼承List<Person>SayHi()遍歷List,循環(huán)SayHi()內(nèi)容不同將所有人都存入集合調(diào)用兩種類型的SayHi()方法擴(kuò)展的麻煩for(inti=0;i<person.Count;i++){if(person[i]isStudent){((Student)person[i]).StuSayHi();}elseif(person[i]isTeacher){((Teacher)person[i]).TeachSayHi();}}進(jìn)行判斷對象類型調(diào)用相應(yīng)類的SayHi()添加多個不同的子類,SayHi()都不同,增加代碼復(fù)雜度如何解決?添加對象后遍歷泛型集合巧妙的做法abstractclassPerson{publicabstractvoidSayHi();}for(inti=0;i<person.Count;i++){person[i].SayHi();}這種方式實(shí)現(xiàn)了面向?qū)ο蟮亩鄳B(tài)

修改Person類添加一個未實(shí)現(xiàn)的方法用關(guān)鍵字修飾去除子類類型判斷生活中的多態(tài)Cut….!!!聽到這個聲音他們會做什么?剪斷頭發(fā)切開皮膚停止表演不同對象對于同一個方法(Cut)調(diào)用的不同行為理發(fā)師外科醫(yī)生演員什么是多態(tài)指不同對象收到相同消息時,會產(chǎn)生不同行為Student和Teacher類SayHi()的內(nèi)容不同同一個類在不同的場合下表現(xiàn)出不同的行為特征PersonStudentTeacherPerson類,在這兩種場合的行為不同抽象類和抽象方法abstractclassPerson{publicabstractvoidSayHi();}抽象方法一個沒有實(shí)現(xiàn)的方法有抽象方法的類必然是抽象類抽象類用來列舉一個類所需要的行為抽象類不明確提供具體實(shí)現(xiàn)方法抽象類必須由其子類實(shí)現(xiàn)它的抽象方法(除非子類也具有抽象性)常見錯誤抽象類不能被實(shí)例化抽象類不能是密封或靜態(tài)的Personperson=newPerson();編譯錯誤抽象類不能用sealed和static修飾實(shí)現(xiàn)抽象方法使用override實(shí)現(xiàn)抽象方法publicoverridevoidSayHi(){//…具體實(shí)現(xiàn)內(nèi)容}重寫實(shí)現(xiàn)抽象方法Dog:AnimalCat:Animal抽象類的應(yīng)用場合abstract

Animal

抽象類和抽象方法實(shí)現(xiàn)多態(tài)性父類提供一系列規(guī)定,約束子類的行為父類可以提供一些共性的行為貓咪喵喵叫狗狗汪汪叫abstract叫()是動物就要會叫里氏替換原則//…Studentstu1=newStudent();Studentstu2=newStudent();List<Person>person=newList<Person>();person.Add(stu1);person.Add(stu2);//…子類對象可以替換父類里氏替換原則(LSP)子類的對象能夠替換其父類父類對象不能夠替換子類父類的方法都要在子類中實(shí)現(xiàn)或者重寫is與as操作符is檢查對象是否與指定類型兼容if(person[i]isStudent)判斷person集合的元素是否是Student對象as用于在兼容的引用類型之間執(zhí)行轉(zhuǎn)換for(inti=0;i<Students.Count;i++){Studentstu=Students[i]asStudent;Console.WriteLine(stu.Name);}轉(zhuǎn)換失敗返回值為空一種類型轉(zhuǎn)換方式為什么需要虛方法大家好,我是某某先生(女士),今年多少歲抽象方法不能在父類實(shí)現(xiàn)學(xué)員大家好,我是某某同學(xué),今年多少歲,喜歡什么老師大家好,我是某某老師,今年多少歲,工作幾年了提供一個通用的方式繼續(xù)完善MySchool學(xué)員和老師也可以使用通用方式默認(rèn)SayHi()能否寫在Person類中?各子類可以重寫不同行為SayHi()可以使用虛方法實(shí)現(xiàn)使用虛方法//Person類中默認(rèn)實(shí)現(xiàn)通用的SayHi()publicvirtualvoidSayHi(){//…省略具體實(shí)現(xiàn)}虛方法用默認(rèn)的SayHi()的對象,子類中不需要重寫SayHi()用自己的SayHi()子類中要重寫SayHi()同樣使用override重寫只能在抽象類中除了密封類都可以寫必須被子類override可以被子類override不允許有方法體要有方法體,哪怕是一個分號用abstract修飾用virtual修飾抽象方法虛方法虛方法與抽象方法面向?qū)ο蟮娜筇匦噪[藏內(nèi)部實(shí)現(xiàn),穩(wěn)定外部接口封裝繼承子類繼承父類成員,實(shí)現(xiàn)代碼復(fù)用多態(tài)不同子類對同一個消息作出不同的反映生活中的接口生活中的接口USB接口使用USB接口必須符合USB規(guī)范接口是一套規(guī)范,遵守這個規(guī)范就可以實(shí)現(xiàn)功能.NET接口同樣是一種規(guī)范和標(biāo)準(zhǔn)可以約束類的行為定義一個接口不指定具體的實(shí)現(xiàn).NET接口一個類實(shí)現(xiàn)IComparable,在類中強(qiáng)制實(shí)現(xiàn)CompareTo方法publicinterfaceISampleInterface{stringName{get;set;}}publicinterfaceISampleInterface{voidShowName();}interface屬性方法…接口中可以包含的內(nèi)容接口的使用接口的名稱通常以“I”開頭IComparable,IList使用方法與繼承一個類相似如果類繼承了父類classStudent:IComparableclassStudent:Person,IComparable繼承了一個類,實(shí)現(xiàn)了一個接口類圖中的表示接口的特點(diǎn)接口可以說是對繼承單根性的擴(kuò)展C#中一個類能否繼承多個父類?不能classStudent:Person,IComparable接口提供了一組規(guī)范,一個標(biāo)準(zhǔn)接口屏蔽了實(shí)現(xiàn)的細(xì)節(jié)Sort方法排序時,無需關(guān)心IComparable如何實(shí)現(xiàn)方便多人協(xié)同開發(fā)可以一組人實(shí)現(xiàn)IComparable,一組人去做排序功能自定義接口如老師和學(xué)員都可以收作業(yè),那么收作業(yè)的方法應(yīng)該放在哪個類?A:Teacher類B:Student類C:兩個都放D:Person類E:重新定義造成代碼冗余如果增加一個工程師類,他不會收作業(yè)如果繼承這個類,Person類怎么辦?調(diào)用收作業(yè)的方法不需要改變自定義一個接口來實(shí)現(xiàn)IHomeworkCollector自定義接口publicinterfaceIHomeworkCollector{voidCollectHomework();}publicclassStudent:Person,IHomeworkCollectorpublicvoidCollectHomework(){MessageBox.Show("報告老師!作業(yè)收集完畢!");}1、定義一個收作業(yè)的接口2、在有收作業(yè)功能的類實(shí)現(xiàn)該接口3、不同的類收作業(yè)方式不同使用自定義接口1、接口作為參數(shù)使用privatevoidDoCollectHomework(IHomeworkCollectorcollector){

collector.CollectHomework();}無論誰收作業(yè)這里都不需要做任何改變2、接口作為返回值使用DoCollectHomework(scofield);privateIHomeworkCollectorCreateHomeworkCollector(stringtype){

switch(type){case"student":collector=newStudent("Scofield",Genders.Male,28,"越獄獄");break;//…}returncollector;}返回一個實(shí)現(xiàn)該接口的對象collector.CollectHomework();作為返回值和參數(shù)的意義接口作為參數(shù)傳遞了實(shí)現(xiàn)接口的對象接口作為返回值返回一個實(shí)現(xiàn)了接口的對象接口和抽象類的對比派生類必須實(shí)現(xiàn)未實(shí)現(xiàn)的方法

包含未實(shí)現(xiàn)的方法

不能實(shí)例化相似點(diǎn)直接實(shí)現(xiàn)需要override實(shí)現(xiàn)抽象方法

實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)所有成員非抽象派生類必須實(shí)現(xiàn)抽象方法

可以實(shí)現(xiàn)多個接口只能繼承一個類

用interface定義用abstract定義不同點(diǎn)接口抽象類

數(shù)組的局限string[]Students=newstring[3]{"張三","李四","王五"};如果每個班級的人數(shù)不固定班級中來了一個新的學(xué)員班級人員的數(shù)組調(diào)整大小困難增加元素困難能否動態(tài)的維護(hù)一個集合?重新定義數(shù)組相同類型和名稱變量的集合ArrayList是一個可動態(tài)維護(hù)長度的集合可維護(hù)動態(tài)長度的集合新增元素可刪除元素可訪問單個元素objectobjectobjectobject0123索引(下標(biāo))object40123ArrayList自動調(diào)整索引通過索引訪問ArrayList的初始化usingSystem.Collections;//…ArrayListStudents=newArrayList();ArrayListTeachers=newArrayList(5);可以指定長度引入命名空間實(shí)例化一個對象常見錯誤未引入命名空間定義時未實(shí)例化引入System.Collections命名空間實(shí)例化ArrayList對象ArrayList添加元素intAdd(Objectvalue)//添加一個對象到集合的末尾ArrayListstudents=newArrayList();Studentscofield=newStudent("Scofield",Genders.Male,28,"越獄獄");//…students.Add(scofield);創(chuàng)建學(xué)員對象添加學(xué)員連續(xù)添加三個學(xué)員對象并獲取集合元素的數(shù)目返回索引ArrayList.Count獲取元素數(shù)目建立班級學(xué)員的集合訪問ArrayList元素(類型)ArrayList[index]//按指定索引(下標(biāo))取得對象Studentstu1=(Student)students[0];stu1.SayHi();…按索引取值轉(zhuǎn)換為學(xué)員對象ArrayList第一個對象的索引是0需要類型轉(zhuǎn)換刪除ArrayList的元素ArrayList.Remove(對象名)//刪除指定對象名的對象ArrayList.RemoveAt(index)//刪除指定索引的對象ArrayList.Clear()//清除集合內(nèi)的所有元素students.RemoveAt(0);students.Remove(zhang);Studentleave=(Student)students[0];leave.SayHi();通過索引刪除對象通過指定對象刪除只剩一個對象剩余的元素會自動調(diào)整索引取得刪除后的第一個對象ArrayList的遍歷//遍歷foreach(Objectstuoinstudents){StudentstuForeach=(Student)stuo;Console.WriteLine(stuForeach.Name);}通過對象遍歷打印對象的Name屬性Scofield張靚靚周杰杰可以使用和數(shù)組類似的方式for(inti=0;i<students.Count;i++){StudentstuFor=(Student)students[i];Console.WriteLine(stuFor.Name);}foreach方式輸出結(jié)果類型轉(zhuǎn)換常見錯誤1//…students.Add(scofield);students.Add(zhang);students.Add(jay);students.RemoveAt(0);students.RemoveAt(1);students.RemoveAt(2);運(yùn)行這段代碼會發(fā)生錯誤?索引會自動調(diào)整刪除兩個元素后,不再有索引“2”常見錯誤2Studentscofield=newStudent("Scofield",Genders.Male,28,"越獄獄");//…Studentstu2=newStudent("Scofield",Genders.Male,28,"越獄獄");//打印集合數(shù)目//…students.Remove(stu2);//打印集合數(shù)目//…如果Remove(stu2),能否刪除scofield對象?定義一個對象與前面的值相同兩次的結(jié)果都是3,沒有刪除,為什么?在多態(tài)章節(jié)中我們將試圖改變這一現(xiàn)象publicstructStudent{publicStudent(stringname,intage){Name=name;Age=age;}publicstringName;publicintAge;}Studentstu1=newStudent("張三",20);Studentstu2=newStudent("李四",20);Studentstu3=newStudent("王五",20);

ArrayListstudents=newArrayList();students.Add(stu1);students.Add(stu2);students.Add(stu3);常見錯誤3staticvoidMain(string[]args){//…初始化代碼將對象加入ArrayList集合foreach(Studentstuinstudents){StudentmyStudent=stu;myStudent.Age=60;}foreach(Studentstuinstudents){Console.WriteLine(stu.Age);}}遍歷顯示年齡結(jié)果是多少?結(jié)構(gòu)是值類型定義一個學(xué)員結(jié)構(gòu)使用ArrayList存儲學(xué)員遍歷修改年齡ArrayList通過索引獲取對象為什么使用HashTable能否像索引器那樣通過關(guān)鍵字獲取該對象呢?動態(tài)可維護(hù)長度可通過關(guān)鍵字檢索C#提供一種集合HashTableStudents["周杰杰"].SayHi();Studentstu1=(Student)Students[0];第三章中的索引器通過關(guān)鍵字獲取對象什么是HashTableArrayList每個元素對應(yīng)一個索引HashTable通常稱為哈希表根據(jù)鍵(Key)可以查找到相應(yīng)的值(Value)objectobjectobjectobjectobject0123…ArrayList索引KeyValueKeyValueKeyValueKeyValueKeyValueHashTable值鍵鍵和值一一對應(yīng)使用哈希表students.Add(scofield.Name,scofield);添加元素KeyValue…Studentstu2=(Student)students["周杰杰"];stu2.SayHi();…通過key獲取元素students.Remove("周杰杰");…通過key刪除元

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論