vs新版4章節課件_第1頁
vs新版4章節課件_第2頁
vs新版4章節課件_第3頁
vs新版4章節課件_第4頁
vs新版4章節課件_第5頁
已閱讀5頁,還剩77頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

主講教師:本課學時:聯系方式:C#程序設計教程第四章面向對象編程基礎

本章主要內容介紹

4.1面向對象概念

4.2類

4.3方法

4.4屬性

4.5類庫與命名空間

4.6小結CONTENT本章學習目標:

熟練掌握類的定義與使用熟練掌握類的字段熟練掌握類的構造函數熟練掌握類的方法的定義和使用掌握類屬性的定義和使用面向對象的基本概念對象類實體抽象數據類概念世界現實世界計算機世界抽象實例化抽象計算機邏輯實現映射對象屬性型號價格里程行為起動停車行駛屬性車輪數量檔的數量行為加速換檔剎車屬性名稱顏色品種行為搖尾巴吃東西犬吠現實世界中某個具體的物理實體在計算機邏輯中的映射和體現對象屬性型號價格里程行為起動停車行駛屬性車輪數量檔的數量行為加速換檔剎車屬性名稱顏色品種行為搖尾巴吃東西犬吠現實世界中某個具體的物理實體在計算機邏輯中的映射和體現類類是C#中的一種結構,用于在程序中模擬現實生活的事物語法:[訪問修飾符]class<類名>{//類的主體}示例:classEmployee{//類的主體}//成員變量//成員方法類與對象類是一種抽象的數據類型將類實例化成對象后方可使用C#中用new運算來創建對象EmployeeobjEmployee;objEmployee=newEmployee();

Form1frm=newForm1();frm.Show();

面向對象的程序設計(OOP)是一種基于結構分析的、以數據為中心的程序設計方法。

面向對象的程序設計方法總體思路:將數據及處理這些數據的操作都封裝(Encapsulation)到一個稱為類(Class)的數據結構中,在程序中使用的是類的實例——對象。

對象是代碼與數據的集合,是封裝好了的一個整體,對象具有一定的功能。也就是說對象是具有一定功能的程序實體。程序是由一個個對象構成的,對象之間通過一定的“相互操作”傳遞消息,在消息的作用下,完成特定的功能。

面向對象的基本概念面向對象程序設計語言的三大原則

1.一切都是對象2.計算通過對象間相互通信,請求其他對象執行動作來實現。對象間通過發送和接收消息來通信3.每個對象都有自己的內存,其中可能包括了其他的對象。面向對象程序設計語言的三大原則封裝性封裝(encapsulation):利用ADT將數據和基于數據的操作密封在一起,系統的其它對象只能通過界面與其交互。封裝機制將數據和代碼捆綁到一起,避免了外界的干擾和不確定性。封裝的優點提高了系統靈活性提高了系統安全性面向對象程序設計語言的三大原則繼承性繼承(Inheritance)是可以讓某個類型的對象獲得另一個類型的對象的屬性的方法。繼承支持按級分類的概念。繼承很好的支持代碼的重用性(reusability)。

面向對象程序設計語言的三大原則多態性多態(Polymorphism):多態的意思是事物具有不同形式的能力。例如,對不同的實例,某個操作可能會有不同的行為。這個行為依賴于所要操作數據的類型。多態機制使具有不同內部結構的對象可以共享相同的外部接口。多態的實現重載(overload)覆蓋(override)4.2類

publicclassteacher{intno;stringname;publicintNo{get{returnno;}set{no=value;}}publicstringName{get{returnname;}

set{name=value;}}

publicteacher() { // //TODO:Addconstructorlogichere // }publicteacher(intno,stringname){this.no=no;=name;}}4.2類

C#2008秉承了C++面向對象的所有關鍵概念:封裝、繼承和多態性。其類型模型是建立在.NET虛擬對象系統之上的。類是面向對象的程序設計的基本構成模塊。從定義上講,類是一種數據結構,這種數據結構可以包含數據成員、函數成員等類型。其中數據成員類型有常量和事件;函數成員類型有方法、屬性和索引器等。定義類的語法語法

[修飾符]class

類名[:基類]{

……

}類聲明中的修飾符修飾符說明interal(默認)訪問修飾符,在同一個程序集中可以訪問public訪問修飾符,任何地方都可訪問abstract抽象類,不能實例化sealed密封類,不能被繼承static靜態類,不能實例化,不能被繼承partial部分類,一個類的代碼可以放在多個文件中,編譯時再將它們合并類的成員類成員說明常量與類相關的常量值字段類中的變量方法類中的函數,完成特定的功能屬性對類的字段提供安全訪問事件用于說明發生了什么事情索引器像使用數組那樣訪問類的數據運算符定義類所特有的運算構造函數和析構函數對類的實例進行初始化和銷毀語法:字段(成員變量)[訪問修飾符]數據類型成員變量;privateprotectedinternalpublic_namestatus….userNameintchar….bool…classEmployee{ privatestring_name; privatechar_gender; privatestring_qualification; privateuint_salary;}…訪問成員變量步驟1:創建一個類的對象EmployeeobjEmployee=newEmployee();步驟2:使用點號訪問成員變量objEmployee._name=“張三";objEmployee._name='M';字段(成員變量)字段的類型可以是C#中任何數據類型5種訪問修飾符對字段都適用(默認為private)訪問修飾符1Teacher類private成員protected成員public成員internal成員Student類只有Student類在Teacher類都在同一程序集中,才可訪問internal成員不可訪問不可訪問可以訪問訪問修飾符2修飾符說明public所屬類的成員以及非所屬類的成員都可以訪問internal當前程序集可以訪問private只有所屬類的成員才能訪問Protectedinternal訪問限于此程序或從該成員所屬的類派生的類型protected所屬類或派生自所屬類的類型可以訪問靜態字段例publicclassemployee{publicstaticintid;publicstringname;publicstaticintemployeecounter;publicstaticintaddemployee(){returnemployeecounter++;}}classProgram{staticvoidMain(string[]args){employee.employeecounter=0;employeee1=newemployee();employee.addemployee();employeee2=newemployee();employee.addemployee();Console.WriteLine("employeecount:{0}\n",employee.employeecounter);Console.ReadLine();}}運行結果:非靜態字段publicclassemployee{publicstaticintid;publicstringname;publicintemployeecounter;publicvoidaddemployee(){employeecounter++;Console.WriteLine("employeecount:{0}",employeecounter);}}classProgram{staticvoidMain(string[]args){employeee1=newemployee();e1.employeecounter=100;Console.WriteLine("employeecount:{0}",e1.employeecounter);employeee2=newemployee();e2.addemployee();Console.ReadLine();}}運行結果:靜態與非靜態字段靜態字段的定義用static關鍵字有效范疇靜態字段屬于類,是類的所有對象所共用的非靜態字段(實例字段)屬于對象,是某個特定對象專用的引用方法類名.靜態字段對象名.非靜態字段publicclassemployee{publicstaticintid;publicstringname;publicintemployeecounter;}字段的初始化classProgram{staticvoidMain(string[]args){employee.id=10;Console.WriteLine("id:{0}\n",employee.id);employeee1=newemployee();e1.employeecounter=100;Console.WriteLine("employeecount:{0}\n",e1.employeecounter);Console.ReadLine();}}運行結果:字段的初始化聲明時自動初始化自動初始化的默認值聲明時用賦值語句初始化賦值語句的執行靜態字段非靜態字段非靜態字段的初始化問題構造函數構造函數是類的一種特殊方法,每次創建類的實例都會調用它[訪問修飾符]<類名>(){//構造函數的主體}語法:…//默認構造函數Employee(){ _qualification="研究生"; }…示例:演示:示例1構造函數classEmployee{

publicstring_name;publicchar_gender;publicstring_qualification;publicuint_salary;

//默認構造函數

public

Employee()

{_qualification=“研究生";

}

staticvoidMain(string[]args)

{ //調用默認構造函數

EmployeeobjEmployee=newEmployee();Console.WriteLine(“資格=" +objEmployee._qualification);Console.WriteLine(“薪水=" +objEmployee._salary);

}}輸出結果:構造函數構造函數是一種特殊的方法特殊的聲明方法名與類同名沒有返回類型特殊的執行每次用new關鍵字創建類的實例時自動執行不能直接調用構造函數特殊的用途初始化對象參數化構造函數[訪問修飾符]<類名>(){//構造函數的主體}語法:([參數列表])…//參數化構造函數Employee(stringstrQualification){_qualification=strQualification; }…示例:參數化構造函數//默認構造函數privateEmployee(){_qualification=“研究生";}//參數化構造函數publicEmployee(stringstrQualification,stringstrName,chargender,uintempSalary){_qualification=strQualification;_name=strName;_gender=gender;_salary=empSalary;}publicstaticvoidMain(string[]args){

//調用默認構造函數EmployeeobjGraduate=newEmployee();//調用參數化構造函數EmployeeobjMBA=newEmployee("ACCPS3","張亮影",'男',5500);Console.WriteLine("默認構造函數輸出:\n資格="+objGraduate._qualification);Console.WriteLine("\n參數化構造函數輸出:\n資格="+objMBA._qualification);Console.ReadLine();}輸出結果:

缺省構造函數規則:類至少要有一個構造函數編譯器通過強制添加缺省構造函數來保證類至少要有一個構造函數缺省構造函數的特點無參調用基類的無參構造函數使用缺省構造函數的條件沒有為類編寫構造函數基類中存在無參的構造函數構造函數的重載課堂上,同學們在討論正在發的新書,有些人想知道該書的id號,例外一些人想知道該書的id號和作者,不過大部分人還是想了解更多,包括該書的id好,書名,作者和價格。而構造函數的重載的原理與此一樣,利用參數的不同,達到程序的多態性。生活例子:構造函數的重載

classBook

{

privatestringid;

privatestringname;

privatestringauthor;

privatestringprice;

publicBook()

//默認構造器

{

}

publicBook(stringid)

{

this.id=id;

}

publicBook(stringid,stringname,stringauthor,stringprice)//構造器重載

{

this.id=id;

=name;

this.author=author;

this.price=price;

}構造函數的重載

publicstringID

//只讀屬性

{

get{returnid;}

}

publicstringName

{

set{=value;}

get{returnname;}

}

publicstringAuthor

{

set{this.author=value;}

get{returnauthor;}

}

publicstringPrice

{

set{this.price=value;}

get{returnprice;}

}構造函數的重載多個構造函數,每個構造函數帶有不同的參數析構函數是用于執行清除操作的特殊方法~<類名>()0{//析構函數的主體}語法:…~Employee(){

}…示例:析構函數

析構函數也是一種特殊的方法特殊的聲明方法名:在類名前加一個~沒有參數,沒有返回類型,沒有訪問修飾符特殊的執行當實例從內存中刪除時,自動調用析構函數不能直接調用析構函數特殊的用途釋放與清理資源(.NET的垃圾回收器的功能及啟動的機制。)4.3方法對象的行為接聽響鈴掛斷PickUp(){….//用于傳送和接收信號的代碼}Ring(){….//用于顯示主叫號碼的代碼}Hang(){….//用于結束會話的代碼}聲明方法語法訪問修飾符(可選),默認情況下為

private[訪問修飾符]返回類型<方法名>([參數列表]){//方法主體}如果不需要返回任何值,方法可能返回void數據類型如果需要返回值,則使用return語句聲明方法…..classPoint{ intx; inty;intz; voidAssign() {

System.Console.WriteLine("輸入點的值");

x=int.Parse(System.Console.ReadLine()); y=int.Parse(System.Console.ReadLine());

z=x*y;

Console.WriteLine("x:{0},y:{1},z:{2}",x,y,z);

}}…..方法Assign()

的定義

不返回任何值(void)

不接收任何值(Assign())Assign()方法方法的參數形參與實參四種類型的參數方法說明值參數形參是實參的一份拷貝形參的改變不影響實參引用型參數ref形參是實參的地址形參的改變將影響實參輸出參數out與引用型參數類似但實參可以不需初始化數組型參數params參數個數可以不確定對于引用類型的值參數靜態方法

publicclassA{int

x;

static

int

y;publicstaticvoidF(){//x=1;

//錯誤,不允許訪問

y=2;

//正確,允許訪問

Console.WriteLine("y={0}",y);}}實例方法classStudent{publicintstudcount=0;publicvoidSer(){studcount++;Console.WriteLine("studcount:{0}",studcount);}}靜態方法靜態方法的定義用static關鍵字方法的調用格式類名.靜態方法對象名.非靜態方法靜態方法的限制靜態方法中不能使用非靜態成員靜態方法與實例方法對于靜態方法和非靜態方法:

(1)靜態方法屬于類所有,非靜態方法屬于類定義的對象所有;(2)非靜態方法可以訪問類中包括靜態成員在內的所有成員,而靜態方法只能訪問類中的靜態成員。方法重載消費者

1固定電話電移動電話帳單管理層供應商

1供應商2電信電電話電對不同的數據執行相同的任務方法重載…ClassBillPayment{ … voidPayBill(inttelephoneNumber) { //此方法用于支付固定電話話費 } voidPayBill(longconsumerNumber) { //此方法用于支付電費 } voidPayBill(longconsumerNumber,doubleamount) { //此方法用于支付移動電話話費 } …}…對不同數據執行相似的功能方法重載intgreatest(intnum1,intnum2){ Console.WriteLine(“{0}和

{1}相比,最大的是:",num1,num2); if(num1>num2)

{ returnnum1;

} else

{ returnnum2;

}}intgreatest(intnum1,intnum2,intnum3){ Console.WriteLine(“{0},{1}和{2}相比,最大的是:",num1,num2,num3); if(num1>num2&&num1>num3)

{ returnnum1;

} elseif(num2>num1&&num2>num3)

{ returnnum2;

} else

{ returnnum3;

}}具有不同數量的參數的方法重載輸出結果:方法重載intgreatest(int[]numbers){

inttemp=numbers[0];

for(inti=1;i<numbers.Length;i++) {

if(temp<numbers[i])

temp=numbers[i]; }

returntemp;}doublegreatest(double[]numbers){doubletemp=numbers[0];

for(inti=1;i<numbers.Length;i++) {

if(temp<numbers[i])

temp=numbers[i]; }

returntemp;}具有不同類型的參數的方法重載輸出結果:方法的簽名publicvoidA(intp1,intp2){}和publicvoidB(intq1,intq2){}的簽名相同,而publicintC(intm1,intm2){}則和方法A簽名不同,因為C的返回值為int方法重載方法重載方法名相同(前提:功能相近)參數類型或者個數不同函數返回值與方法重載如果僅是函數返回值類型不同,并不是方法重載方法的簽名(MSDN)由方法的名稱和它的形參表組成。形參按從左到右的順序比較類型、種類和個數。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication3{classProgram{staticvoidMain(string[]args){Vehicle[]v=newVehicle[3];v[0]=newVehicle();v[1]=newCar();v[2]=newPlane();foreach(Vehicleveinv){Console.WriteLine(ve.Start());}Console.ReadKey();}}classVehicle{publicvirtualstringStart(){return"交通工具啟動";}}classCar:Vehicle{publicoverridestringStart(){return"汽車起步";}}classPlane:Vehicle{publicoverridestringStart(){return"飛機起飛";}}}輸出結果:方法的覆蓋方法重寫對基類同名方法,用關鍵字virtual修飾,即虛方法對派生類同名方法,用關鍵字override修飾4.4屬性字段訪問級別設為public存在的問題C#用屬性來解決此問題不直接操作類的字段,而是借助訪問器get與set進行讀寫訪問器中可以根據程序邏輯在讀、寫字段時進行適當的檢查充分體現了面向對象的封裝性屬性例讀取

Name時調用將值賦給Name時調用

屬性的聲明只讀、只寫屬性

[訪問修飾符]數據類型屬性名

{ get{}; set{};}get訪問器用return與屬性類型一致的值set訪問器與屬性類型相同的隱式參數value命名空間

英國澳大利亞紐卡斯爾紐卡斯爾命名空間ClassManager{longintsalary;………………}…….…….{longintsalary;…….………}ClassManager命名空間AdminDept命名空間ITDeptAdminDept.ManagerITDept.Manager類庫命名空間Class

溫馨提示

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

評論

0/150

提交評論