C#經典入門教程詳解ppt課件_第1頁
C#經典入門教程詳解ppt課件_第2頁
C#經典入門教程詳解ppt課件_第3頁
C#經典入門教程詳解ppt課件_第4頁
C#經典入門教程詳解ppt課件_第5頁
已閱讀5頁,還剩426頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第1章C#與NET平臺介紹本章目標,了解.NETFramework的結構理解.NETFramework的基本概念CLRJITCTSMSIL了解.NETFramework命名空間了解C#程序的基本結構,1C#語言的由來,在過去的二十年里,C和C+已經成為在商業(yè)軟件的開發(fā)領域中使用最廣泛的語言。它們?yōu)槌绦騿T提供了十分靈活的操作,不過同時也犧牲了一定的開發(fā)效率。與VB等語言相比,同等級別的C/C+應用程序往往需要更長時間來開發(fā)。由于C/C+語言的復雜性,許多程序員都試圖尋找一種新的語言,希望能在功能與效率之間找到一個更為理想的權衡點。VB以犧牲靈活性的代價來提高效率??墒沁@些靈活性正是C/C+程序員所需要的。這些解決方案對編程人員的限制過多(如屏蔽一些底層代碼控制的機制),所提供的功能難以令人滿意。這些語言無法方便地同早先的系統(tǒng)交互,也無法很好地和當前的網絡編程相結合。,對于C/C+用戶來說,最理想的解決方案無疑是在快速開發(fā)的同時又可以調用底層平臺的所有功能。他們想要一種和最新的網絡標準保持同步并且能和已有的應用程序良好整合的環(huán)境。另外,一些C/C+開發(fā)人員還需要在必要的時候進行一些底層的編程。C#(Csharp)是對這一問題的解決方案。C#是一種新的、面向對象的編程語言。它使得程序員可以快速地編寫各種基于Microsoft.NET平臺的應用程序,Microsoft.NET提供了一系列的工具和服務來最大程度地開發(fā)利用計算與通訊領域。,C#語言的特點:C#語言是Microsoft發(fā)布的一種全新的編程語言,是其.Net戰(zhàn)略的一枚重要棋子。C#語言是面向對象的、現代的編程語言,用C#編寫的應用程序可以充分利用.Net的框架體系帶來的優(yōu)點.既可以用來編寫基于通用網絡協(xié)議的Internet服務軟件,也可以編寫各種數據庫、網絡服務應用程序和Windows窗口界面程序。C#繼承了C/C+的優(yōu)點和靈活性,能夠充分利用OS系統(tǒng)的底層功能,同時又具備了完全的面向對象特性??梢宰尦鯇W者直接了解面向對象編程的各種概念,學習現代的編程思想和手段。,2.NET代碼的編譯語言特定的編譯器和運行庫,代碼被執(zhí)行,IL+元數據,CLR,IL和CLR的使用IntermediateLanguageCommonLanguageRuntime,編譯執(zhí)行.NET程序,Microsoft中間語言,MSIL+元數據,機器代碼,代碼被執(zhí)行,CLR,MSIL,幫助語言實現互操作,IL不是字節(jié)代碼,但很接近字節(jié)代碼。因此,執(zhí)行應用程序時,IL到機器碼的轉換速度非???!,通過CLR將MSIL轉換為具體CPU的代碼,CPU無關的指令集,語言編譯器,.NET源代碼,程序集,client.exe,client.exe,clientlib.dll,client.exe,module,IL語言范例,IL_0000:nopIL_0001:callIL_0006:nopIL_0007:ldc.i4.0IL_0008:callIL_000d:nopIL_000e:ldnullIL_000f:ldftnIL_0015:newobjIL_001a:callIL_001f:nopIL_0020:newobjIL_0025:callIL_002a:nopIL_002b:newobjIL_0030:throw,通用語言運行時CLR,.NET的語言互操作性:不同語言編寫的代碼可互相調用C#的平臺移植性:框架JIT編譯器(JustInTime,即時編譯器。),3.NETFramework簡介,.NETFramework類似于JVM.NETFramework兩個主要組件:通用語言運行時(CLR)統(tǒng)一的類庫集.NET的類庫:線程文件輸入/輸出(I/O)數據庫支持XML解析數據結構,.NETFramework的體系結構,VisualStudio.NET,CLR通用語言運行時(CLR),BaseClassLibrary:IO,Drawing,Threading,DataandXML,XMLWebservices,WindowsForms,WebForms,通用語言規(guī)范(CLS),VB,C+,C#,JScript,操作系統(tǒng),.NetFramework類庫(FCL),CLS和CTS,通用語言規(guī)范CLSCommonLanguageSpecification規(guī)定所有.NET語言都應遵循的規(guī)則生成可與其他語言互操作的應用程序通用類型系統(tǒng)(CommonTypeSystem,CTS。)包含標準數據類型包含準則集,CLS、CTS和MSIL緊密配合以實現語言互操作性,命名空間就像在文件系統(tǒng)中一個文件夾容納多個文件一樣,可以看作某些類的一個容器。通過把類放入命名空間可以把相關的類組織起來,并且可以避免命名沖突。命名空間既用作程序的“內部”組織系統(tǒng),也用作“外部”組織系統(tǒng)(一種向其他程序公開自己擁有的程序元素的方法)使用命名空間:using類似#include,4命名空間,1.HclassA,2.HclassA,3.cpp#include“1.h”#include“2.h”.,3.cppclassAclassA,namespacea1classA,namespacea2classA,3.csusinga1;usinga2;a1.Aa2.A,常用命名空間,5創(chuàng)建“HelloWorld”應用程序,單擊“開始”“程序”“MicrosoftVisualStudio.NET2005”“MicrosoftVisualStudio.NET2005”此時將打開VS.NET2005的起始頁要創(chuàng)建C#控制臺應用程序,請從列表中選擇“創(chuàng)建建”“項目”。此時將打開“新建項目”窗口選擇“VisualC#項目”作為項目類型,選擇“控制臺應用程序”作為模板,C#模板,Console.WriteLine(HelloWorld);,輸出,HelloWorld.csprojAssemblyInfo.csProgram.cs,“HelloWorld”應用程序文件,編譯和執(zhí)行C#應用程序,要生成C#項目,請從菜單中選擇“生成”“生成解決方案”該過程將編譯項目中包括的所有文件,編譯結果顯示在“輸出”窗口中如果結果顯示“生成:1成功或最新,0失敗,0被跳過”,則說明已經成功生成,然后即可交付該應用程序,要運行剛才生成的應用程序,請從菜單中選擇“調試”“開始執(zhí)行(不調試)”輸出結果顯示在VS.NET控制臺窗口中,C#應用程序文件夾結構,VisualStudio.NET2005創(chuàng)建一個與項目同名的文件夾,此處為“HelloWorld”該文件夾包含項目文件“HelloWorld.csproj”和其他關聯(lián)文件每個新項目都創(chuàng)建了bin、obj和Properties三個文件夾。Bin和obj這兩個文件夾下都有一個Debug子目錄,其中包含可執(zhí)行文件HelloWorld.exe在“解決方案資源管理器”中啟用“顯示所有文件”選項,可查看“HelloWorld”項目的結構,/這是用C#編寫的一個簡單的HelloWorld程序usingSystem;namespaceNotepadclassHelloWorldstaticvoidMain()Console.WriteLine(HelloWorld);,聲明HelloWorld類,描述代碼的注釋,HelloWorld程序,程序入口點,Main的返回類型為void,控制臺類的WriteLine()方法用于顯示輸出結果,導入System命名空間,聲明命名空間Notepad,將文件保存為*.cs,說明:1.程序一般包括以下幾部分:名稱空間的引用:使用using關鍵字指明引用的名稱空間。名稱空間的聲明:使用namespace關鍵字聲明名稱空間。類:使用class關鍵字聲明類。Main方法:Main方法是C#程序的入口。2.類中包含了程序所要用到的數據和所要執(zhí)行的方法的定義。每個類中可以有:(1)變量聲明(2)構造函數(3)方法(4)屬性(5)事件3.一個文件中可以有1個或者多個類。4.所有語句都以分號;結束。,.,C#語言基礎,第2章,目標,在C#中定義變量和常量使用C#中的基本數據類型理解裝箱和拆箱的概念使用C#中的運算符,選擇結構和循環(huán)結構定義和使用數組,了解結構和枚舉了解C#中的預處理指令理解C#中常用的字符串處理方法,第一個C#程序:HelloWorld,usingSystem;classHelloWorldstaticvoidMain()Console.WriteLine(“Hello,World!”);,HelloWorld.cs,第一個C#程序:HelloWorld,1:usingSystem;,第1行:,using關鍵字用來引用.NET框架類庫中的資源通常在程序文件的開頭使用如果程序中需要多種資源,可以使用多次usingSystem命名空間System命名空間提供了構建應用程序所需的系統(tǒng)統(tǒng)能的訪問,第一個C#程序:HelloWorld,2:classHelloWorld3:.8:,第2,3,8行:,類在C#或其他面向對象語言中,需要編寫類使用關鍵字class定義一個類,類的內容放在一對中示例中定義了一個名為HelloWorld的類,第一個C#程序:HelloWorld,4:staticvoidMain()5:.7:,第4,5,7行:,Main方法Main方法是應用程序的入口點,編譯器將由該處開始執(zhí)行程序方法體也放在一對中每個C#的應用程序都必須包含Main方法,4:staticvoidMain()5:.7:,第4,5,7行:,Main方法static表示Main方法是一個全局方法void表示Main方法沒有任何返回值,即返回值是空參數放在小括號中定義。此處括號內沒有內容,表明Main方法沒有任何參數,第一個C#程序:HelloWorld,6:Console.WriteLine(“Hello,World!”);,第6行:,語句在C#中要執(zhí)行的指令語句之間用;分隔,編譯器通過分號來區(qū)分多個語句使用大括號標識某個代碼塊的開始和結束,從而可以對語句進行組合。大括號必須成對匹配。,第一個C#程序:HelloWorld,6:Console.WriteLine(“Hello,World!”);,第6行:,語句HelloWorld程序的主要目的就是在屏幕上顯示一條問候WriteLine方法用來將問候語寫到標準輸出設備上。Console代表標準輸出設備-屏幕,它屬于System命名空間WriteLine方法是Console類的方法。訪問類或對象的方法使用點取符.來完成。字符串用雙引號“”表示字符串“Hello,World”是WriteLine方法的參數,表示屏幕輸出的內容,第一個C#程序:HelloWorld,系統(tǒng)預定義類型,系統(tǒng)預定義類型,字面量,int:intiMax=int.MaxValue;intpVal=int.Parse(“100”);shorti16=50;inti32=i16;i16=i32;錯誤i16=(short)i32;decimaldecimaliRate=3.9834M;iRate=decimal.Round(iRate,2);/四舍五入iRate=decimal.Remainder(512.0M,51.0M);,boolboolbt=(bool)1;/錯誤charstringpattern=“123abcd?”;boolbt;bt=char.IsLetter(pattern,3);bt=char.IsNumber(pattern,3);bt=char.IsLower(pattern,3);bt=char.IsPunctuation(pattern,7);bt=char.IsLetterOrDigit(pattern,3);,single,doublefloatf=24567.66f;doubled=124.45;If(Single.IsNaN(1/0)使用Parse轉換數字字符串shortshParse=Int16.Parse(100);intiParse=Int32.Parse(100);longshParse=Int64.Parse(100);decimaldParse=decimal.Parse(“99.99);floatsParse=float.Parse(“99.99);doubledParse=double.Parse(“99.99);,字符串,字符串直接量stringpath;path=”C:note.txt”;path=“C:note.txt”;字符串操作索引字符串中的單個字符stringstr=“abcd”;charc=str0;字符串連接strings1=“Myage=“;intmyAge=28;stringcat=s1+myAge;,字符串操作抽取和定位子串stringpoem=“InXanadudidKublaKhan”;stringpoemSeg=poem.Substring(10);poemSeg=poem.Substring(0,9);intindex=poem.IndexOf(“I”);index=poem.LastIndexOf(“n”);比較字符串boolisMatch;stringtitle=AncientMariner;isMatch=(title=ANCIENTAMRINER);isMatch=(title.ToUpper()=ANCIENTMARINER);isMatch=title.Equals(AncientMariner);,String常用方法,C#中常用的字符串處理方法:Equals():比較兩個字符串的值是否相等ToLower():將字符串轉換成小寫形式IndexOf():查找某個字符在字符串中的位置SubString():從字符串中截取子字符串Join():連接字符串Split():分割字符串Trim():去掉字符串兩邊的空格,實例,將一文件名的擴展名改為.dat。例:1.txt改為1.dat,usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespace_011classProgramstaticvoidMain(stringargs)stringfilename=1.2.txt;intindexDot=filename.LastIndexOf(.);stringextendName=dat;filename=filename.Substring(0,indexDot+1);filename+=extendName;Console.WriteLine(filename);,String常用方法應用1,已有如下代碼,按要求增加功能:,staticvoidMain(stringargs)stringemail;/電子郵件地址Console.WriteLine(請輸入你的郵箱:);email=Console.ReadLine();Console.WriteLine(你的郵箱是0,email);,需實現的功能:1、輸入yes時,程序循環(huán)執(zhí)行2、兼容以下各種形式y(tǒng)es(YES、yes、YeS.)3、提取郵箱的用戶名,usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespace_011classProgramstaticvoidMain(stringargs)while(1)stringemail;/電子郵件地址Console.WriteLine(請輸入你的郵箱:);email=Console.ReadLine();Console.WriteLine(你的郵箱是0,email);Console.WriteLine(繼續(xù)輸入郵箱嗎?);stringinput=Console.ReadLine();if(input.ToUpper()=YES)continue;elsebreak;,while(true),String常用方法應用2,輸入一個字符串,輸出每個單詞,重新用下劃線連接輸出,使用Split()方法分割字符串使用Join()方法連接字符串,Split()方法分割字符串,代碼分析,splitStrings=inputString.Split();,/將分割后的字符串使用下劃線連接在一起joinString=string.Join(_,splitStrings);,返回值為字符串數組,字符串變量名,參數:分隔符(char型),返回字符串,靜態(tài)方法,參數1:連接符參數2:字符串數組,關鍵代碼:,Join()方法連接字符串,usingSystem;classProgramstaticvoidMain(stringargs)stringinputString;inputString=Console.ReadLine();inputString=inputString.Trim();stringsplitStrings=inputString.Split();stringjoinString=string.Join(_,splitStrings);Console.WriteLine(joinString);,如果字符串兩邊有空格?,Format()方法,兩種輸出字符串的方式:,stringname=李四;Console.WriteLine(Mynameis+name+,Iam+18);,stringname=李四;Console.WriteLine(Mynameis0,Iam1,name,18);,格式字符串,變量列表,String類的Format()方法用來格式化字符串,關鍵代碼:,record=string.Format(姓名:0n出生年月:1n身高:2n血型:3n星座:4n最喜歡的食物:5,name,birthday,height,bloodType,planet,favourFood);Console.WriteLine(n這是你的個人檔案:);Console.WriteLine(record);,參數與WritLine()方法相似,Format()的語法小結,stringmyString=string.Format(格式字符串,參數列表);,stringmyString=string.Format(0乘以1等于2,2,3,2*3);,格式字符串,代表,參數列表,2乘以3等于6,包括占位符x,小結,補充下劃線處的占位符,輸出五個成語,stringyi=一;stringer=二;stringsan=三;stringword=string.Format(獨_無_,_心_意,垂涎_尺,略知_,舉_反_,yi,er,san);Console.WriteLine(word);,stringyi=一;stringer=二;stringsan=三;stringword=string.Format(獨0無1,2心1意,垂涎2尺,略知01,舉0反2,yi,er,san);Console.WriteLine(word);,枚舉,accessmodifiersenum:enum_baseenumbody,classMyAppenumFabric:intCotton=1,Silk=2,Wool=4staticvoidMain()Fabricfab=Fabric.Cotton;intfabNum=(int)fab;stringfabType=fab.ToString();Console.WriteLine(fab);,整型,默認為int,默認為internal,枚舉和位標志,namespaceMyHelloAppclassmyAppFlagsenumFabricCotton=1,Silk=2staticvoidMain()Fabricfab1=(Fabric)3;Console.WriteLine(fab1.ToString();,System.Enum的方法,usingSystem;namespaceApp1classmyAppenumFabricCotton=1,Silk=2staticvoidMain()stringfabStr=Cotton;if(Enum.IsDefined(typeof(Fabric),fabStr)Fabricfab=(Fabric)Enum.Parse(typeof(Fabric),fabStr);Console.WriteLine(Enum.GetName(typeof(Fabric),2);,變量,staticvoidMain(stringargs)/聲明布爾型、字符串型、整型、短整型和浮點型變量boolt=false;shortn1=30;intn2=1200;stringstr=jeny;floatn3=23.1f;/顯示變量值Console.WriteLine(布爾值=+t);Console.WriteLine(短整型值=+n1);Console.WriteLine(整型值=+n2);Console.WriteLine(字符串值=+str);Console.WriteLine(浮點值=+n3);,變量中存儲的值取決于該變量的類型,常量,staticvoidMain(stringargs)/PI常量PIconstfloat_pi=3.1415169F;/由地球引力引起的加速度常量,單位為cm/s*sconstfloat_gravity=980;/鐘擺的長度intlength=60;/鐘擺的周期doubleperiod=0;/鐘擺周期的計算公式period=2*_pi*Math.Sqrt(length/_gravity);Console.WriteLine(鐘擺的周期為0秒,period);,聲明常量,在表達式中使用常量,const關鍵字用于聲明常量,數組,數組是同一數據類型的一組值數組屬于引用類型,因此存儲在堆內存中數組元素初始化或給數組元素賦值都可以在聲明數組時或在程序的后面階段中進行語法:數據類型,數組名稱=new類型n,;intarrayHere=newint6;,數組,staticvoidMain(stringargs)intcount;Console.WriteLine(“請輸入準備登機的乘客人數);count=int.Parse(Console.ReadLine();/聲明一個存放姓名的字符串數組,其長度等于乘客人數stringnames=newstringcount;/用一個for循環(huán)來接受姓名for(inti=0;i0)charch=pathi1;if(ch=)break;i-;dir=path.Substring(0,i);name=path.Substring(i);staticvoidMain()stringdir,name;/變量作為輸出參數無須明確賦值SplitPath(c:WindowsSystemhello.txt,outdir,outname);Console.WriteLine(dir);Console.WriteLine(name);,c:WindowsSystemhello.txt,參數數組,在不能確定需要傳遞多少個參數的時候可以使用params關鍵字指明一個可變的參數數組。數組參數的類型必須是一維數組,而且必須是形參表中的最后一個參數。數組參數始終是值傳遞方式進行傳遞,不能將params同ref和out組合。,例如,下面定義一個具有params參數的求平均值函數:publicdoubleAVG(paramsintNums)intSum=0;intCount=0;foreach(intninNums)Sum+=n;Count+=1;Nums0=100;return(Sum/Count);調用該函數時,可以采用下面的語句:Class1a=newClass1();doubled=a.AVG(13,27,33,25,78);另外,還可以傳遞一個實際的數組:intargs=31,41,46,53,28;doubled=a.AVG(args);args0=?,3.5屬性成員,屬性主要用于描述和維護類對象的狀態(tài)。從客戶端看,對屬性的訪問就好像直接訪問public字段成員,但在類內部是通過類方法訪問的。創(chuàng)建一個屬性包括兩步:1.聲明一個字段來存儲屬性值2.編寫一個屬性聲明,提供訪問接口,屬性的建立要使用屬性聲明,語法如下:訪問修飾符類型名屬性名getreturn字段;set私有字段=value;,publicclasscheckvalprivatestringp_PropVal;/聲明一個私有變量p_PropValpublicstringstr1/聲明屬性str1get/返回存儲在私有變量中的屬性值returnp_PropVal;set/存儲屬性值到私有變量if(Convert.ToString(value).Length=10)p_PropVal=value;elseConsole.WriteLine(toomanywords);,可以說,屬性是一種特殊的方法,但屬性和方法也有不同之處,主要有:屬性不必使用圓括號,但方法一定使用圓括號。屬性不能制定參數,方法可以指定參數。屬性不能使用void類型,方法則可以使用void類型。屬性使用方法與變量相同。,屬性說明,可以創(chuàng)建只讀或只寫屬性,即只有get或set方法??梢詣?chuàng)建靜態(tài)屬性,用static關鍵字。靜態(tài)屬性不與特定實例有關聯(lián),因此在靜態(tài)屬性的get和set方法內引用this是錯誤的。靜態(tài)屬性使用類名訪問,并且,與靜態(tài)屬性相配合的私有字段也應該是靜態(tài)的。,例3-7:publicclasscheckvalprivatestaticstringp_time=00:00:00;/靜態(tài)私有字段publicstaticstringmytime/靜態(tài)屬性getreturnp_time;publicstaticstringmytime1/靜態(tài)屬性setp_time=value;staticvoidMain()Console.WriteLine(checkval.mytime);checkval.mytime1=10:2:22;Console.WriteLine(nowis+checkval.mytime);,輸出結果為:00:00:00nowis10:2:22,3.3.6this關鍵字this引用的是當前實例。this關鍵字是一個隱含引用,它隱含于每個類的成員函數中。this關鍵字引用類的當前對象,成員通過this關鍵字可以知道自己屬于哪一個實例。publicclassTest1publicstringstr;publicvoidf(stringstr)this.str=str;publicstaticvoidMain()Test1test=newTest1();test.f(aaa);靜態(tài)函數沒有this關鍵字。,將對象作為參數傳遞到其他方法,例如:publicclassTest1publicstringstr=aaa;publicvoidf(Test1test)str=bbb;Console.WriteLine(test.str);publicvoidf1()f(this);publicstaticvoidMain()Test1test=newTest1();test.f1();,索引器,訪問修飾符數據類型this數據類型標識符get;set;,語法,參數化成員屬性:包含set、get方法。與成員屬性不同:它可以接受1個或多個參數使用this作為索引器的名字,定義和調用索引器,classPhotostring_title;publicPhoto(stringtitle)this._title=title;publicstringTitlegetreturn_title;,以Title屬性表示照片,將照片存放于數組photos中,classAlbum/該數組用于存放照片Photophotos;publicAlbum(intcapacity)photos=newPhotocapacity;,定義和調用索引器4-2,publicPhotothisintindexget/驗證索引范圍if(index=photos.Length)Console.WriteLine(索引無效);/使用null指示失敗returnnull;/對于有效索引,返回請求的照片returnphotosindex;setif(index=photos.Length)Console.WriteLine(索引無效);return;photosindex=value;,帶有int參數的Photo索引器,讀/寫索引器,定義和調用索引器,publicPhotothisstringtitleget/遍歷數組中的所有照片foreach(Photopinphotos)/將照片中的標題與索引器參數進行比較if(p.Title=title)returnp;Console.WriteLine(未找到);/使用null指示失敗returnnull;,帶有string參數的Photo索引器,只讀索引器,定義和調用索引器,staticvoidMain(stringargs)/創(chuàng)建一個容量為3的相冊Albumfamily=newAlbum(3);/創(chuàng)建3張照片Photofirst=newPhoto(Jeny);Photosecond=newPhoto(Smith);Photothird=newPhoto(“Lono);/向相冊加載照片family0=first;family1=second;family2=third;/按索引檢索PhotoobjPhoto1=family2;Console.WriteLine(objPhoto1.Title);/按名稱檢索PhotoobjPhoto2=family“Jeny;Console.WriteLine(objPhoto2.Title);,中級特性,面向對象技術的三個核心概念:封裝:將數據和操作組合到一起,并決定哪些數據和操作對外是可見的。繼承:父類中的變量和行為,子類可以同樣使用。本質是代碼重用。多態(tài):由繼承引出的一種機制,父類型的引用變量可以指向子類型的對象。,封裝,封裝把對象的所有組成部分組合在一起,有三個作用隱藏類的實現細節(jié):使用方法將類的數據隱藏起來。迫使用戶去使用一個界面去訪問數據:定義程序如何引用對象的數據,控制用戶對類的修改和訪問數據的程度。使代碼更好維護:類的內部實現改變,對外接口可以不變。,繼承,繼承提供了創(chuàng)建新類的一種方法,繼承對開發(fā)者來說就是代碼共享。通過繼承創(chuàng)建的子類是作為另一個類的擴充或修正所定義的一個類。子類從超類(父類)中繼承所有方法和變量。子類和超類之間是特化與范化的關系。,子類的聲明,語法:子類聲明:父類子類體子類可以使用父類的protected和public可見的變量和方法,就像這些變量和方法是自己定義的一樣。C#中,如果類聲明時沒有聲明父類,那么缺省為Object類的子類。C#中的所有類都是System.Object類的子類。C#中,子類只能繼承一個父類。,classCarintcolor;intdoor;intspeed;voidPushBreak()publicvoidAddOil(),classTrashCar:CarclassMyAppstaticvoidMain()TrashCarmyCar=newTrashCar();myCar.AddOil();myCar.PushBreak();,派生類的建立需要注意:(1).派生類會繼承基類除了構造函數和析構函數的所有成員。(2).派生類調用構造函數時,會先調用基類的構造函數。默認調用沒有參數的構造函數。(3).用base關鍵字顯式調用基類構造函數。,classCarpublicCar(inti)classTrashCar:CarpublicTrashCar(inti),classCarpublicCar(inti)classTrashCar:CarpublicTrashCar(inti):base(i),錯誤,錯誤,publicCar(),去掉base(i),(3).如果需要調用基類中的同名方法,應該使用”base.方法名”來調用。classCarpublicCar()protectedvoidf()Console.WriteLine(aaa);classTrashCar:CarpublicTrashCar()voidf()Console.WriteLine(bbb);publicvoidf1()base.f();f();classMyAppstaticvoidMain()TrashCarmyCar=newTrashCar();myCar.f1();,例3-8繼承格式舉例publicclassparent/建立基類publicparent(stringstr)/基類帶參數構造函數Console.WriteLine(str);publicvoidshowposition()/基類方法Console.WriteLine(基類的位置在(0,0));publicclasschild:parent/派生子類publicchild():base(調用基類構造)/子類構造函數,調用基類構造函數Console.WriteLine(Iamchild);publicvoidshowposition()base.showposition();/調用基類方法Console.WriteLine(派生類的位置在(10,10));在Main()方法中執(zhí)行下面的代碼:parentprt=newparent(Iamaparent);childchd=newchild();prt.showposition();chd.showposition();,輸出結果為:Iamaparent調用基類構造Iamchild基類的位置在(0,0)基類的位置在(0,0)派生類的位置在(10,10),例3-9:編寫一個程序,計算球,圓錐,圓柱的表面積和體積usingSystem;namespaceConApp1publicclassCircleprotecteddoubleradius;publicCircle(doubler)radius=r;publicdoubleGetArea()returnMath.PI*radius*radius;publicclassSphere:Circle/球體類publicSphere(doubler):base(r)publicdoubleGetArea()return(4*base.GetArea();publicdoubleGetVolumn()return(4*Math.PI*Math.Pow(radius,3)/3);publicclassCylinder:Circle/圓柱類privatedoubleheight;/添加高度字段publicCylinder(doubler,doubleh):base(r)height=h;publicdoubleGetArea()return(2*base.GetArea()+2*Math.PI*radius*height);publicdoubleGetVolumn()return(Math.PI*radius*radius*height);,publicclassCone:Circle/圓錐類privatedoubleheight;/添加高度字段publicCone(doubler,doubleh):base(r)height=h;publicdoubleGetArea()return(Math.PI*radius*(radius+Math.Sqrt(height*height+radius*radius);publicdoubleGetVolumn()return(Math.PI*radius*radius*height/3);publicclassTesterpublicstaticvoidMain()Circlec1=newCircle(2);Spheres1=newSphere(2);Cylindercd1=newCylinder(2,10);Conecn1=newCone(2,10);Console.WriteLine(s1sserfacearea=0,volumn=1,s1.GetArea(),s1.GetVolumn();Console.WriteLine(cd1sserfacearea=0,volumn=1,cd1.GetArea(),cd1.GetVolumn();Console.WriteLine(cn1sserfacearea=0,volumn=1,cn1.GetArea(),cn1.GetVolumn();Console.ReadLine();,多態(tài),繼承機制引出多態(tài)機制某一類型的引用變量可以指向該類或者其子類的對象。由于C#中System.Object類是所有類的祖先,所以可以用Object類型的引用指向所有類型的對象。,classCarclassTrashCar:CarCarcar=newTrashCar();Objectobj=newCar();obj=newTrashCar();,3.5.2多態(tài)性多態(tài)性是指不同的對象收到相同的消息時,會產生不同動作。C#支持兩種類型的多態(tài)性:(1)編譯時的多態(tài)性是通過重載類實現的,系統(tǒng)在編譯時,根據傳遞的參數個數、類型信息決定實現何種操作。(2)運行時的多態(tài)性是指在運行時,根據實際情況決定實現何種操作。C#中運行時的多態(tài)性通過虛函成員實現。,編譯時多態(tài)-重載,重載指在同一個類中至少有兩個方法用同一個名字,但有不同的參數。重載使得從外部來看,一個操作對于不同的對象有不同的處理方法。調用時,根據參數的不同來區(qū)別調用哪個方法。方法的返回類型可以相同或不同,但它不足以使返回類型變成唯一的差異。重載方法的參數表必須不同。,classCarintcolor;intdoor;intspeed;publicvoidPushBreak()speed=0;publicvoidPushBreak(ints)speed-=s;,Carcar=newCar();car.PushBreak();car.PushBreak(2);,運行時多態(tài)-動態(tài)綁定(虛函數),動態(tài)綁定就是根據對象的類型決定調用哪個方法,而不是引用的類型。類的方法使用virtual關鍵字修飾后就成為虛方法,包括兩個步驟:(1).對于基類中要實現多態(tài)性的方法,用virtual關鍵字修飾。不允許再有static,abstract或override修飾符。(2).對于派生類中的同名方法(覆蓋)-相同的名稱、返回類型和參數表,使用override關鍵字修飾。不能有new、static或virtual修飾符。,多態(tài)-覆蓋,C#中聲明覆蓋時,父類方法前加virtual關鍵字,表示該方法可以被覆蓋;子類方法前加override,表示將方法覆蓋。當用于子類的行為與父類的行為不同時,覆蓋機制允許子類可以修改從父類繼承來的行為。,例3-11下面的代碼中,子類重寫了父類的虛方法sleep()。publicclassanimal/基類publicvirtualvoidsleep()/虛方法Console.WriteLine(animalallneedsleep);publicclassfish:animal/派生類publicoverridevoidsleep()/重寫虛方法Console.WriteLine(fishsleepingwitheye_open);publicclassdog:animal/派生類publicoverridevoidsleep()/重寫虛方法Console.WriteLine(dogsleepingwitheye_closed);,Main()中的代碼:animalan=newanimal3;an0=newanimal();an1=newfish();an2=newdog();an0.sleep();an1.sleep();an2.sleep();,輸出結果:animalallneedsleepfishsleepingwitheye_opendogsleepingwitheye_closed,實現多態(tài)性的核心和實質:使用基類的引用指向派生類的對象,當程序運行時,編譯器會自動確定基類對象的實際運行時類型,并根據實際類型調用正確的方法。,例3-12classGeometricObjectpublicvirtualvoiddraw()Console.WriteLine(GeometricObject!);classEllipse:GeometricObjectpublicoverridevoiddraw()Console.WriteLine(Ellipse!);publicvoidgetvecter()classCircle:Ellipsepublicoverridevoiddraw()Console.WriteLine(Circle!);publicdoubl

溫馨提示

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

評論

0/150

提交評論