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

下載本文檔

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

文檔簡(jiǎn)介

1、,第三章 C#面向?qū)ο蠡A(chǔ),面向?qū)ο?3.1、面向?qū)ο蟮乃枷?3.2、類和對(duì)象 3.3 、類的構(gòu)造函數(shù)和析構(gòu)函數(shù) 3.4、方法 3.5、運(yùn)算符重載 3.6、域與屬性 3.7、索引指示器,第3章 C#面向?qū)ο笤O(shè)計(jì)基礎(chǔ),3.1 面向?qū)ο蟮乃枷?面向過(guò)程的程序設(shè)計(jì)(七十年代) 面向過(guò)程就是分析出解決問(wèn)題所需要的步驟,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了。 程序的結(jié)構(gòu)規(guī)定為順序、選擇和循環(huán)三種基本結(jié)構(gòu),采取自頂向下、逐步求精的分析和設(shè)計(jì)方法,即功能分析方法。 面向?qū)ο蟮某绦蛟O(shè)計(jì)(八十年代開始) 面向?qū)ο笫前褬?gòu)成問(wèn)題的事物分解成各個(gè)對(duì)象,建立對(duì)象的目的不是為了完成一個(gè)步驟

2、,而是為了描敘某個(gè)事物在整個(gè)解決問(wèn)題的步驟中的行為。 面向?qū)ο蠹夹g(shù)以對(duì)象為基礎(chǔ),將軟件視為是由一群相互關(guān)聯(lián)對(duì)象組成的整體,這些對(duì)象能理解從其他對(duì)象發(fā)出的消息,并以適當(dāng)?shù)男袨樽鞒鲰憫?yīng),從而實(shí)現(xiàn)軟件的整體功能。面向?qū)ο缶幊叹褪侵苯用鎸?duì)軟件所模擬的客觀世界中的事物,將它們直接映射成軟件的組成對(duì)象。,3.1 面向?qū)ο蟮乃枷?例如五子棋,面向過(guò)程的設(shè)計(jì)思路就是首先分析問(wèn)題的步驟: 1、開始游戲 2、黑子先走 3、繪制畫面 4、判斷輸贏 5、輪到白子 6、繪制畫面 7、判斷輸贏 8、返回步驟2 9、輸出最后結(jié)果。把上面每個(gè)步驟用分別的函數(shù)來(lái)實(shí)現(xiàn),問(wèn)題就解決了。,3.1 面向?qū)ο蟮乃枷?面向?qū)ο蟮脑O(shè)計(jì)則是從

3、另外的思路來(lái)解決問(wèn)題。 整個(gè)五子棋可以分為 1、黑白雙方,這兩方的行為是一模一樣的,2、棋盤對(duì)象,負(fù)責(zé)繪制畫面,3、規(guī)則對(duì)象,負(fù)責(zé)判定諸如犯規(guī)、輸贏等。 第一類對(duì)象(玩家對(duì)象)負(fù)責(zé)接受用戶輸入,并告知第二類對(duì)象(棋盤對(duì)象)棋子布局的變化,棋盤對(duì)象接收到了棋子的變化就要負(fù)責(zé)在屏幕上面顯示出這種變化,同時(shí)利用第三類對(duì)象(規(guī)則系統(tǒng))來(lái)對(duì)棋局進(jìn)行判定。,6,3.1 面向?qū)ο蟮乃枷?3.1.1. 什么是面向?qū)ο?Coad和Yourdon給出了一個(gè)定義: “面向?qū)ο?對(duì)象+類+繼承+通信” 將數(shù)據(jù)及處理這些數(shù)據(jù)的操作都封裝到一個(gè)稱為類的數(shù)據(jù)結(jié)構(gòu)中,在程序中使用的是類的實(shí)例對(duì)象。 對(duì)象是代碼與數(shù)據(jù)的集合,是

4、封裝好的一個(gè)整體。對(duì)象具有一定的功能,也就是說(shuō)對(duì)象是具有一定功能的程序?qū)嶓w。 程序是由一個(gè)個(gè)對(duì)象構(gòu)成的,對(duì)象之間通過(guò)一定的“相互操作”傳遞消息,在消息的作用下,完成特定的功能。,7,3.1 面向?qū)ο蟮乃枷?什么是面向?qū)ο??為什么需要面向?qū)ο竽??要解決這些問(wèn)題,我們首先看一個(gè)簡(jiǎn)單的例子。,8,3.1 面向?qū)ο蟮乃枷?面向?qū)ο笏枷肴绱丝紤]: 場(chǎng)景中所有角色抽象起來(lái)總共有兩類:加水器和水箱 水箱空,觸發(fā)加水器加水 水箱的體積決定加水器加多少水 將加水器和水箱具體化成1號(hào)、2號(hào)、3號(hào)裝置,9,3.1 面向?qū)ο蟮乃枷?3.1.2. 面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的三個(gè)特性 封裝:就是用一個(gè)框架把數(shù)據(jù)和代碼組合在一

5、起,形成一個(gè)對(duì)象,對(duì)象是封裝的基本單元。 繼承:是面向?qū)ο缶幊碳夹g(shù)的一塊基石,通過(guò)它可以創(chuàng)建分級(jí)層次的類。繼承是父類和子類之間共享數(shù)據(jù)和方法的機(jī)制,通常把父類稱為基類,子類稱為派生類。 多態(tài)性:同一個(gè)消息或操作作用于不同的對(duì)象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。,10,3.1 面向?qū)ο蟮乃枷?3.1.3. 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念 類和對(duì)象 屬性、方法與事件 封裝 繼承 重載 多態(tài)性,3.2、類和對(duì)象,在C#中,class為類的關(guān)鍵字。 把屬于類的對(duì)象稱為類的實(shí)例,可以把類看成是對(duì)象的模板,把對(duì)象看成是類的實(shí)例。,1、類的聲明 【格式】: 類修飾符 class 類名:基類類名 成員定義列

6、表; 【功能】:定義一個(gè)由“類名”指定的類。,12,1)支持的類修飾符,13,訪問(wèn)修飾符 -封裝,Teacher 類,private 成員,protected 成員,public 成員,internal 成員,Student 類,只有 Student 類在 Teacher 類都在同一程序集中,才可訪問(wèn)internal成員,不可訪問(wèn),不可訪問(wèn),可以訪問(wèn),14,2)如果缺省類修飾符,默認(rèn)為private。 3)“基類類名”指定派生該類的基類,如果該類沒有從任何類繼承,則不需要該選項(xiàng)。 4)“成員定義列表”類成員有兩部分組成:一個(gè)是新聲明的類成員;另一個(gè)則是直接從它的基類繼承而來(lái)的成員。 類成員聲明

7、主要包括:常數(shù)、字段、方法、屬性、事件、索引器、運(yùn)算符、構(gòu)造函數(shù)、析構(gòu)函數(shù)等。 類成員聲明中的訪問(wèn)修飾符:public、private、protected、internal中。默認(rèn)訪問(wèn)修飾符為private。,15,字段:字段是與類相關(guān)的變量,相當(dāng)于C+中的變量。 常量:用來(lái)定義與類相關(guān)的常量值。 事件:是類的成員,它可以讓對(duì)象通知調(diào)用者某些特定的行為發(fā)生時(shí)間。 方法:完成類中各種計(jì)算或功能的操作,類似函數(shù)。 屬性:定義類的特征,并對(duì)他們提供讀、寫操作。,類成員的組成:,16,索引器:允許編程人員在訪問(wèn)數(shù)組時(shí),通過(guò)索引器訪問(wèn)類的多個(gè)實(shí)例。又稱下標(biāo)指示器。 運(yùn)算符:定義類的實(shí)例能使用的運(yùn)算符。

8、構(gòu)造函數(shù):在類被實(shí)例化時(shí)首先執(zhí)行的函數(shù),主要完成對(duì)象初始化操作。 析構(gòu)函數(shù):在對(duì)象被銷毀之前最后執(zhí)行的函數(shù),主要是完成對(duì)象結(jié)束時(shí)的收尾操作。,17,屬性,型號(hào),價(jià)格,里程,行為,起動(dòng),停車,行駛,屬性,車輪數(shù)量,檔的數(shù)量,行為,加速,換檔,剎車,屬性,名稱,顏色,品種,行為,搖尾巴,吃東西,犬 吠,類的示例,收銀員類,顧客類,顧客 姓名: 年齡: 體重: 操作: 購(gòu)買商品,屬性,姓名: 職銜: 年齡: 體重: 操作: 收款 打印帳單,行為,19,例:成員常量的聲明 關(guān)鍵字const用于聲明常量,后跟數(shù)據(jù)類型的聲明。類的常量可以加上new、public、protected、internal或pr

9、ivate修飾。 Class A public const double A=1.0; public const double X=1.0,Y=2.0,Z=3.0; ,20,2、類的靜態(tài)成員和實(shí)例成員 靜態(tài)成員:有static,屬于類所有,只能通過(guò)類名來(lái)訪問(wèn)。 實(shí)例成員:沒有static,屬于類的實(shí)例所有,又稱實(shí)例成員,只能通過(guò)類的實(shí)例對(duì)象來(lái)訪問(wèn)。 example1.cs,21,using System; class Example1 static public int a;/靜態(tài)成員 public int b; /實(shí)例成員 void Meth1() /實(shí)例方法 a = 10; /實(shí)例方法中可

10、以訪問(wèn)本類的靜態(tài)成員 b = 20; /實(shí)例方法中可以訪問(wèn)本類的實(shí)例成員 static void Meth2() a = 30; /靜態(tài)方法能夠訪問(wèn)本類的靜態(tài)成員 /b=40; /靜態(tài)方法不能訪問(wèn)本類的實(shí)例成員 ,22,public static void Main() Example1 E1 = new Example1();/產(chǎn)生類的實(shí)例E1 Example1 E2 = new Example1();/產(chǎn)生類的實(shí)例E2 E1.Meth1(); /調(diào)用非靜態(tài)方法需使用類的實(shí)例 /E1.Meth2(); /此語(yǔ)句出現(xiàn)錯(cuò)誤,因?yàn)殪o態(tài)方法只能由類來(lái)調(diào)用 Example1.Meth2(); Cons

11、ole.WriteLine(a=0,b=1,Example1.a,E1.b); /E2.a=50; /此語(yǔ)句出現(xiàn)錯(cuò)誤,因?yàn)殪o態(tài)不能由對(duì)象的實(shí)例訪問(wèn) Example1.a = Example1.a + 50;/靜態(tài)成員只能通過(guò)類來(lái)訪問(wèn) E2.b = Example1.a + 60; /此語(yǔ)句正確,實(shí)例成員由對(duì)象來(lái)訪問(wèn),靜態(tài)成員由類來(lái)訪問(wèn) Console.WriteLine(a=0,b=1, Example1.a, E2.b); ,23,【格式】: 類名 實(shí)例名=new 類名(參數(shù)); 【功能】:生成一個(gè)由“類名”指定的類的名為“實(shí)例名”的實(shí)例,如果有參數(shù)則將參數(shù)傳遞給構(gòu)造函數(shù)。 【說(shuō)明】: 1)

12、、new關(guān)鍵字實(shí)際上是調(diào)用構(gòu)造函數(shù)來(lái)完成實(shí)例的初始化工作。,3、對(duì)象的聲明,對(duì)象相當(dāng)于現(xiàn)實(shí)世界中的實(shí)體 在指定一個(gè)類后,往往把屬于這個(gè)類的對(duì)象稱為類的實(shí)例,可以把類看成是對(duì)象的模板,把對(duì)象看成是類的實(shí)例。 比如:人和張三;int和10,24,2)、創(chuàng)建實(shí)例也可以分為兩步:先定義實(shí)例變量,然后用new關(guān)鍵字創(chuàng)建實(shí)例。 類名 實(shí)例名; /定義類的實(shí)例變量 實(shí)例名=new 類名(參數(shù));/創(chuàng)建類的實(shí)例。 如:Student Stu1=new Student(); 等價(jià)于:Student Stu1; Stu1=new Student();,25,3.3 、類的構(gòu)造函數(shù)和析構(gòu)函數(shù),C#中有兩個(gè)特殊的函數(shù)

13、:構(gòu)造函數(shù)、析構(gòu)函數(shù)。 構(gòu)造函數(shù):是在創(chuàng)建類的實(shí)例(也就是對(duì)象)時(shí)首先執(zhí)行的函數(shù)。 析構(gòu)函數(shù):是當(dāng)實(shí)例(對(duì)象)從內(nèi)存中銷毀前最后執(zhí)行的函數(shù)。 這兩個(gè)函數(shù)的執(zhí)行是無(wú)條件的,系統(tǒng)會(huì)自動(dòng)在創(chuàng)建對(duì)象時(shí)調(diào)用構(gòu)造函數(shù),在銷毀對(duì)象時(shí)調(diào)用析構(gòu)函數(shù),而不需要程序員通過(guò)代碼調(diào)試。,26,1、構(gòu)造函數(shù) 作用:為對(duì)象分配存儲(chǔ)空間,完成初始化操作(給類的成員變量賦值等)。 構(gòu)造函數(shù)有如下規(guī)則: 1)構(gòu)造函數(shù)的函數(shù)名和類的名稱一樣。 2)當(dāng)某個(gè)類沒有構(gòu)造函數(shù)時(shí),系統(tǒng)將自動(dòng)為其創(chuàng)建默認(rèn)構(gòu)造函數(shù)。 example1() ;,3)構(gòu)造函數(shù)的訪問(wèn)修飾符總是public。如果是private,則表示這個(gè)類不能被實(shí)例化,這通常用于只

14、含有靜態(tài)成員的類中。 4)構(gòu)造函數(shù)不用聲明返回類型。 5)構(gòu)造函數(shù)可以帶參數(shù)也可以不帶參數(shù)。 example2.cs,27,class Employee protected string ID,Name,Salary; public Employee() ID=0000; Name=*; Salary=0; Console.WriteLine(0t1t2,ID,Name,Salary); public Employee(string id) ID=id; Name=空缺; Salary=空缺; Console.WriteLine(0t1t2,ID,Name,Salary); ,public E

15、mployee(string id,string name) ID=id; Name=name; Salary=空缺; Console.WriteLine(0t1t2,ID,Name,Salary); public Employee(string id,string name,string salary) ID=id; Name=name; Salary=salary; Console.WriteLine(0t1t2,ID,Name,Salary); ,28,class Inquire public static void Main() Console.WriteLine(員工IDt員工姓名t

16、薪水); Employee e1=new Employee(); Employee e2=new Employee(0001); Employee e3=new Employee(0023,Green); Employee e4=new Employee(1023,Smith,3400); ,29,3.4、方法,1、方法的定義 2、方法的調(diào)用 3、參數(shù)的傳遞 4、方法的嵌套與遞歸調(diào)用 5、靜態(tài)方法和非靜態(tài)方法 6、方法重載,30,對(duì)象的行為,接聽,響鈴,掛斷,PickUp() . /用于傳送和接收信號(hào)的代碼 ,Ring() . /用于顯示主叫號(hào)碼的代碼 ,Hang() . /用于結(jié)束會(huì)話的代碼

17、 ,31,3.4.1聲明方法,語(yǔ)法,訪問(wèn)修飾符(可選),默認(rèn)情況下為 private,訪問(wèn)修飾符 返回類型 (參數(shù)列表) / 方法主體 ,如果不需要返回任何值,方法需定義為void 數(shù)據(jù)類型,方法頭不是一條語(yǔ)句,其后不能跟分號(hào)“;”,“形式參數(shù)說(shuō)明列表”是一個(gè)由逗號(hào)分隔開的列表,32,舉例:求任意兩個(gè)整數(shù)之間的所有數(shù)的平方和。 private static int pfh(int x, int y)/方法頭 int i,sum=0;/方法中變量的定義 for (i = x; i = y; i+) sum = sum + i * i; return (sum); ,有返回值,33,舉例:要求用戶

18、輸入姓名,然后輸出幾行如下信息: “歡迎您,*同學(xué)。這里是c#編程世界!”,private static void Welcome()/方法頭 int i; string xm; Console.WriteLine(請(qǐng)輸入您的姓名:); xm=Console.ReadLine(); for (i=1;i=5;i+) Console.WriteLine(“歡迎您,0同學(xué)。這里是C#編程世界!,xm); ,沒有返回值,要加上void,34,2、方法的調(diào)用 有三種格式: 【格式1】: 方法名(實(shí)際參數(shù)類表) 【格式2】: 對(duì)象名.方法名(實(shí)際參數(shù)類表) 【格式3】: 類名.方法名(實(shí)際參數(shù)類表) 格

19、式三只能調(diào)用非本類的另一個(gè)類的靜態(tài)方法。,35,【說(shuō)明】: 1)調(diào)用方法時(shí),如果方法有形式參數(shù),在調(diào)用時(shí)應(yīng)在“()”中使用實(shí)際參數(shù)。 2)沒有返回值的方法作為一條語(yǔ)句; 有返回值的方法方法的調(diào)用相當(dāng)于一個(gè)同類型的數(shù)據(jù),可以作為表達(dá)式或表達(dá)式的一部分參與運(yùn)算。 example4.cs、example5.cs,36,example4.cs class example private static int pfh(int x, int y)/方法頭 int i,sum=0;/方法中變量的定義 for (i = x; i = y; i+) sum = sum + i * i; return (sum)

20、; public static void Main() int a, b; Console.WriteLine(請(qǐng)輸入兩個(gè)整數(shù)); a = Convert.ToInt32(Console.ReadLine(); b = Convert.ToInt32(Console.ReadLine(); Console.WriteLine(0到1之間的所有整數(shù)的平方和是2, a, b, pfh(a, b); ,調(diào)用方法,37,example5.cs class example private static void Welcome()/方法頭 int i; string xm; Console.WriteL

21、ine(請(qǐng)輸入您的姓名:); xm=Console.ReadLine(); for (i=1;i=5;i+) Console.WriteLine(“歡迎您,0同學(xué)。這里是C#編程世界!,xm); public static void Main() Welcome();/沒有返回值,當(dāng)成普通的指令訪問(wèn) ,38,3、參數(shù)的傳遞 參數(shù)傳遞實(shí)參把數(shù)據(jù)傳給形參的方式 C#中的參數(shù)傳遞可分為4種:值傳遞、引用傳遞、輸出參數(shù)和參數(shù)數(shù)組。 1)值傳遞 實(shí)參把值復(fù)制一份傳給形參,形參接受了實(shí)參的值后與實(shí)參已不存在任何聯(lián)系。 在方法中對(duì)形參的修改不會(huì)影響到對(duì)應(yīng)的實(shí)參,這種傳遞方式又稱為單向傳遞。 example6

22、.cs,39,using System; class example static void exch(int a, int b) int t; t = a; a = b; b = t; public static void Main() int x, y; Console.WriteLine(請(qǐng)輸入x和y的值:); x = Convert.ToInt32(Console.ReadLine(); y = Convert.ToInt32(Console.ReadLine(); exch(x, y); Console.WriteLine(轉(zhuǎn)化后的x和y的值:0,1, x, y); ,40,沒有改變

23、的原因是“值傳遞”。,x,x,(a)函數(shù)調(diào)用時(shí)的參數(shù)傳遞,(b)改變形參的值不會(huì)影響實(shí)參,可見實(shí)參把值傳遞給形參后,實(shí)參和形參之間不再存在聯(lián)系, 對(duì)形參的修改不會(huì)影響到對(duì)應(yīng)的實(shí)參值。,41,2)引用傳遞 和值參數(shù)不同,引用型參數(shù)并不開辟新的內(nèi)存區(qū)域,而是向方法傳遞實(shí)參在內(nèi)存中的地址。 形式參數(shù)的類型說(shuō)明符前加上關(guān)鍵字ref 調(diào)用方法時(shí),在實(shí)際參數(shù)之前加上關(guān)鍵字ref。 example7.cs,42,class example static void exch( ref int a, ref int b) int t; t = a; a = b; b = t; public static voi

24、d Main() int x, y; Console.WriteLine(請(qǐng)輸入x和y的值:); x = Convert.ToInt32(Console.ReadLine(); y = Convert.ToInt32(Console.ReadLine(); exch(ref x,ref y); Console.WriteLine(轉(zhuǎn)化后的x和y的值:0,1, x, y); ,43,3)輸出型參數(shù) C#提供了一種特殊的參數(shù)傳遞方式,僅用于從方法傳遞回一個(gè)結(jié)果,用關(guān)鍵字out表示。 與引用型參數(shù)類似,輸出型參數(shù)也不開辟新的內(nèi)存區(qū)域。 調(diào)用函數(shù)時(shí),相應(yīng)實(shí)參前應(yīng)加關(guān)鍵字Out。 Example8.cs

25、,該函數(shù)相當(dāng)于可以有多個(gè)返回值,44,class Exa public void ab(int a, out int b, out int c) b = a - 1; c = a + 1; class Test public static void Main() Exa exa1 = new Exa(); int a = 8; int b, c; exa1.ab(a, out b, out c); System.Console.WriteLine(b); System.Console.WriteLine(c); ,45,4)參數(shù)數(shù)組 形參數(shù)組前用params修飾符進(jìn)行聲明就是參數(shù)數(shù)組,可以向函

26、數(shù)傳遞個(gè)數(shù)變化的參數(shù)。 要求如下: 參數(shù)數(shù)組必須位于形參列表的最后。 參數(shù)數(shù)組必須是一維數(shù)組。 不允許將params修飾符與ref和out修飾符組合起來(lái)使用。 與參數(shù)數(shù)組對(duì)應(yīng)的實(shí)參可以是同一類型的數(shù)組名,也可以是任意多個(gè)與該數(shù)組的元素屬于同一類型的變量。 若實(shí)參是數(shù)組則按引用傳遞,若實(shí)參是變量或表達(dá)式則按值傳遞。 Example10.cs,46,static int ParamsMeth(ref int sum, params int arr) int i; for (i = 0; i arr.Length; i+) sum = sum + arri; arri = arri * arri;

27、return (arrarr.Length - 1); ,參數(shù)數(shù)組,47,static void Main() int a = 1, 2, 3 ; int i, l; int s = 0; ParamsMeth(ref s, a); Console.WriteLine(和為0, s); for (i = 0; i a.Length; i+) Console.WriteLine(a0=1, i, ai); S=0; l=ParamsMeth(ref s, 23, 45); Console.WriteLine(“和為:0,1”, s,l);/l是45的平方 ,48,4、方法的嵌套與遞歸調(diào)用 1)、

28、方法的嵌套調(diào)用 在C#中,不能在一個(gè)方法中定義另一個(gè)方法,但c#中方法可以嵌套調(diào)用。,編寫一個(gè)函數(shù)求下列的函數(shù)值: s (x, n)=x/(1!+2!+3!+n!) 分析: 本例的關(guān)鍵是求分母:1!+2!+3!+n!,這是一個(gè)連加的式子,其關(guān)鍵是求第i項(xiàng)階乘。 example11.cs,49,static double fact(int k)/求k的階乘函數(shù) int i; double f=1.0; for(i=1;i=k;i+) f=f*i; return (f); ,static double sum(int n)/求階乘和 int i; double s=0.0; for(i=1;i=n

29、;i+) s=s+fact(i); return (s); ,嵌套調(diào)用,50,static void Main()/調(diào)用函數(shù) double x,f; int n; Console.WriteLine(請(qǐng)輸入x的值:); x=Convert.ToSingle(Console.ReadLine(); Console.WriteLine(請(qǐng)輸入n的值:); n=Convert.ToInt32(Console.ReadLine(); f=x/sum(n); Console.WriteLine(最后結(jié)果為:0,f); ,51,2)、方法的遞歸調(diào)用 C#中允許方法的遞歸調(diào)用,即在調(diào)用一個(gè)方法的過(guò)程中,又出

30、現(xiàn)了直接或間接地調(diào)用該方法本身。 例:若干人排成一個(gè)隊(duì)領(lǐng)蘋果,已知第一個(gè)領(lǐng)的蘋果數(shù)為1,從第二個(gè)人開始每個(gè)人領(lǐng)的蘋果是前一個(gè)人領(lǐng)的蘋果數(shù)的2倍再加3,問(wèn)第n個(gè)人領(lǐng)了多少個(gè)蘋果? 遞歸函數(shù)apple(n)表示:,apple (n),1 n=1,2*apple(n-1)+3 n1,52,Static int apple (int n)/遞歸函數(shù) int k; if(n=1) k=1; else k=2*apple(n-1)+3; return(k); ,53,5、靜態(tài)方法和非靜態(tài)方法 定義靜態(tài)時(shí)用static修飾 不能用virtual、abstract或override修飾符。 非靜態(tài)方法可以訪問(wèn)

31、類中包括靜態(tài)成員在內(nèi)的所有成員,而靜態(tài)方法只能訪問(wèn)類中的靜態(tài)成員。,54,6、方法重載與覆蓋(同類重載,繼承覆蓋) 1)重載 重載是面向?qū)ο蟮囊粋€(gè)重要特征,通過(guò)重載可以使多個(gè)具有相同功能但是參數(shù)不同的方法共享同一個(gè)方法名。 方法重載的實(shí)現(xiàn): 在一個(gè)類中兩次或多次定義同名的方法(包括從基類繼承而來(lái)的方法),但每個(gè)方法的參數(shù)類型或個(gè)數(shù)不同; 用戶調(diào)用方法時(shí),系統(tǒng)能夠自動(dòng)識(shí)別應(yīng)調(diào)用的方法。 Example12.cs,55,class OverTest public double area(double r)/求圓的面積,只有一個(gè)參數(shù) return (Math.PI * r * r); public

32、double area(double a, double b)/求矩形面積,有兩個(gè)參數(shù) return (a * b); public double area(double a, double b, double c)/求三角形面積,有三個(gè)參數(shù) double i, s; i = (a + b + c) / 2; s = Math.Sqrt(i * (i - a) * (i - b) * (i - c); return (s); ,56,class Exam public static void Main() OverTest shape = new OverTest();/定義類的實(shí)例 Cons

33、ole.WriteLine(R is0,Area is 1, 3.0, shape.area(3.0); Console.WriteLine(A is 0,B is1,Area is2, 3.0, 4.0, shape.area(3.0, 4.0); Console.WriteLine(“A is 0,B is1,C is2,Area is3”, 3.0, 4.0,5.0, shape.area(3.0, 4.0,5.0); ,57,2)覆蓋(new或者virtual+override) 在一個(gè)有繼承關(guān)系的類層次結(jié)構(gòu)中,類中的方法由兩部分組成,一個(gè)是類體中聲明的方法,另一個(gè)則是直接從它的基類繼

34、承而來(lái)的方法。 但派生類很少會(huì)一成不變的繼承基類中所有的方法,如果需要對(duì)基類的方法作出修改,就要在派生類中對(duì)基類方法進(jìn)行覆蓋。(編譯時(shí)實(shí)現(xiàn)多態(tài)) 有兩種覆蓋方式: 一種是用關(guān)鍵字new修飾派生類中與基類同名的方法,這樣基類中的同名方法會(huì)被隱藏; 另一種更為靈活和有效的途徑是首先將基類的方法用關(guān)鍵字virtual修飾為虛擬方法,再由派生類用關(guān)鍵字override修飾同名的方法,表明是對(duì)基類的虛擬方法重載。(運(yùn)行時(shí)多態(tài),動(dòng)態(tài)綁定) Example13.cs Example14.cs,58,Using system; Class Shape protected double width; prote

35、cted double height; public Shape( ) width=height=0; public shape( double x) width=height=x; public Shape(double w,double h) width=w; height=h; public double area( ) return width*height; ,Example13.cs,59,Class Triangle:Shape /三角形 public Triangle(double x,double y):base(x,y); new public double area()

36、/派生類方法與基類,方法同名,編譯時(shí)會(huì)有警號(hào)信息 return width*height/2; ,Class Trapezia:Shape /梯形 double width2; public Trapezia(double w1,double w2,double h): base(w1,h) width2=w2; new public double area() /加new隱藏基類的area方法 return (width+width2)*height/2; ,60,Class Test static void main() Shape A =new Shape(2,4); Triangle

37、B =new Triangle(1,2); Trapezia C=new Trapezia(2,3,4); Console.WriteLine(“A.area=0”,A.area(); /調(diào)Shape的area方法 Console.WriteLine(“B.area=0”,B.area(); /調(diào)Triangle的area Console.WriteLine(“C.area=0”,C.area(); /調(diào)Trapezia的area方法 ,61,using System; class Shape protected double width; protected double height; p

38、ublic Shape() width=height=0; public Shape( double x) width=height=x; public Shape( double w, double h) width=w; height=h; public virtual double area() return width*height; ,Example14.cs,/基類中用virtual 修飾符聲明一個(gè)虛方法,62,class Triangle:Shape public Triangle( double x, double y ):base (x, y) public override

39、 double area()/派生類override覆蓋基類虛方法 return width*height/2; ,Class Trapezia:Shape /梯形 double width2; public Trapezia(double w1,double w2,double h): base(w1,h) width2=w2; public override double area() ( )/派生類override覆蓋基類虛方法 return (width+width2)*height/2; ,63,class Test static void main( ) Shape A=new S

40、hape(2,4); Triangle B=new Triangle(1,2); Trapezia C=new Trapezia(2,3,4); Console.WriteLine(“A.area=0”,A.area(); /調(diào)Shape的area方法 Console.WriteLine(“B.area=0”,B.area(); /調(diào)Triangle的area Console.WriteLine(“C.area=0”,C.area(); /調(diào)Trapezia的area方法 ,64,虛方法使用注意事項(xiàng): 1)不能將虛方法聲明為靜態(tài)的,因?yàn)槎鄳B(tài)性是針對(duì)對(duì)象的,不是針對(duì)類的。 2)不能將虛方法聲明為

41、私有的,因?yàn)樗接蟹椒ú荒鼙慌缮惛采w。 3)覆蓋方法必須與它相關(guān)的虛方法匹配,也就是說(shuō),它們的方法簽名(方法名稱、參數(shù)個(gè)數(shù)、參數(shù)類型)、返回類型以及訪問(wèn)屬性都應(yīng)該完全一致。,65,3.5、運(yùn)算符重載,系統(tǒng)對(duì)大部分運(yùn)算符都給出了常規(guī)定義 但可以根據(jù)需要給這些運(yùn)算符賦予一個(gè)新的含義,這就是運(yùn)算符的重載。,66,【格式】: 返回類型值 operator 運(yùn)算符(運(yùn)算對(duì)象列表) 重載的實(shí)現(xiàn)部分; 【說(shuō)明】: 1)、返回類型可以是任意合法的C#類型修飾符,或自定義類型,在方法實(shí)現(xiàn)部分通過(guò)return語(yǔ)句返回該數(shù)據(jù)類型的數(shù)據(jù)。 2)、在C#中,可以重載的運(yùn)算符主要有:+,-,!,+,-,true,fals

42、e,*,/,%, public Complex(double m, double n)/構(gòu)造函數(shù) a = m; b = n; public static Complex operator +(Complex x, Complex y)/重載“+”運(yùn)算符使之能夠?qū)蓚€(gè)復(fù)數(shù)進(jìn)行加運(yùn)算 Complex t = new Complex(0, 0); t.a = x.a + y.a; t.b = x.b + y.b; return (t); ,68,public void DispCom()/ 顯示復(fù)數(shù)的值 if (b 0) Console.WriteLine(0+1i, a, b); else Con

43、sole.WriteLine(01i, a, b); ,69,class Test public static void Main() Complex x = new Complex(1, 2); x.DispCom(); Complex y=new Complex(3,4); y.DispCom(); Complex z=new Complex(0,0); z=x+y; z.DispCom(); ,思考:請(qǐng)對(duì)復(fù)數(shù)運(yùn)算符 和*重載(點(diǎn)乘返回值為double),Complex.cs,70,3.6 域與屬性,1、域又稱字段,它是類的一個(gè)成員,相當(dāng)于C+類中的一種簡(jiǎn)單成員變量,而在C#中換了名字罷了

44、。 【格式】: 域修飾符 域類型名 域名; public double width;,71,【說(shuō)明】: 1)修飾符有:new, public, protected, internal, private, static, readonly等。 2)在域定義時(shí)如果加上了readonly修飾符表明該域?yàn)橹蛔x域。只讀域只能在域定義中及域所屬類的構(gòu)造函數(shù)或靜態(tài)構(gòu)造函數(shù)中進(jìn)行賦值,在其他情況下均不能改變只讀域的值。 example16.cs,72,class box public double high; public double width; public readonly double weight

45、 = 5; public static int count = 0; public box(double h, double w, double wt) high = h; width = w; weight = wt;/構(gòu)造函數(shù)中可以設(shè)定值 count+; ,73,class boxTest public static void Main() box B1 = new box(10, 20, 300); Console.WriteLine(Count=0,High=1,Width=2,Weight=3,box.count,B1.high,B1.width,B1.weight); / B1.w

46、eight = B1.weight + 5; /錯(cuò)誤,只讀域只能在定義時(shí)和構(gòu)造函數(shù)中賦值 box B2 = new box(20, 40, 600); Console.WriteLine(Count=0,High=1,Width=2,Weight=3,box.count,B1.high,B2.width,B2.weight); ,74,2、屬性 屬性是對(duì)現(xiàn)實(shí)世界中實(shí)體特征的抽象,它提供了一種對(duì)類或?qū)ο筇卣鬟M(jìn)行訪問(wèn)的機(jī)制。 如:一個(gè)窗口的標(biāo)題、一個(gè)控件的尺寸。 與域相比,屬性具有良好的封裝性。屬性不允許直接操作類的數(shù)據(jù)內(nèi)容,而是通過(guò)訪問(wèn)器進(jìn)行訪問(wèn)(使用get和set對(duì)屬性的值進(jìn)行讀寫)。,75,

47、【格式】: 屬性修飾符 類型說(shuō)明符 屬性名 訪問(wèn)聲明 【說(shuō)明】: 1)屬性修飾符有new, public, protected, internal, private, static, virtual, override和abstract 9種。 2)訪問(wèn)聲明用來(lái)聲明屬性訪問(wèn)器。 set給屬性賦值 get獲取屬性值 如果只有g(shù)et訪問(wèn)器,表示屬性只讀;如果只有set訪問(wèn)器,表示只寫屬性;兩個(gè)都有,表示讀寫屬性。 3)get訪問(wèn)函數(shù)是一個(gè)不帶參數(shù)的方法,它用于向外部返回屬性成員的值。通常訪問(wèn)函數(shù)的語(yǔ)句或語(yǔ)句塊主要由return或throw語(yǔ)句返回某個(gè)變量成員的值。,76,如: public cla

48、ss Enployee private string name; private long ID; private int salary; public string Name /定義屬性成員Name get return name; set if (name!=value) name=value; ,Enployee Myenployee=new Enployee(); String name1=Myenployee.Name; ,String name1=M; X,可以通過(guò)屬性成員的訪問(wèn),訪問(wèn)類中的某個(gè)變量(私有或公有),這樣就可以通過(guò)屬性成員把類本身與應(yīng)用該類

49、的程序分割開來(lái),很好的體現(xiàn)了類的封裝性。,77,set訪問(wèn)函數(shù) Set訪問(wèn)函數(shù)是一個(gè)帶有簡(jiǎn)單值類型參數(shù)的方法,用于處理類外部的寫入值。 set函數(shù)帶有一個(gè)特殊的關(guān)鍵字value,在set函數(shù)中通過(guò)value將外部的輸入傳遞進(jìn)來(lái),然后賦值給類中的某個(gè)變量成員。 上例中,set函數(shù)將對(duì)象的值賦給了私有變量name。,78,myEmployee.Name=“smith”; 自動(dòng)執(zhí)行set部分,將“smith”賦值給myEmployee的私有變量成員name。 string name1=myEnployee.Name; 則定義的變量name1將通過(guò)get函數(shù)獲得對(duì)象myEmployee的屬性Name的值。 example17.cs,79,public i

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論