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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、構(gòu)造函數(shù):在類被實例化時首先執(zhí)行的函數(shù),主要完成對象初始化操作。 析構(gòu)函數(shù):在對象被銷毀之前最后執(zhí)行的函數(shù),主要是完成對象結(jié)束時的收尾操作。,17,屬性,型號,價格,里程,行為,起動,停車,行駛,屬性,車輪數(shù)量,檔的數(shù)量,行為,加速,換檔,剎車,屬性,名稱,顏色,品種,行為,搖尾巴,吃東西,犬 吠,類的示例,收銀員類,顧客類,顧客 姓名: 年齡: 體重: 操作: 購買商品,屬性,姓名: 職銜: 年齡: 體重: 操作: 收款 打印帳單,行為,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)成員和實例成員 靜態(tài)成員:有static,屬于類所有,只能通過類名來訪問。 實例成員:沒有static,屬于類的實例所有,又稱實例成員,只能通過類的實例對象來訪問。 example1.cs,21,using System; class Example1 static public int a;/靜態(tài)成員 public int b; /實例成員 void Meth1() /實例方法 a = 10; /實例方法中可

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

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

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

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

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,對象的行為,接聽,響鈴,掛斷,PickUp() . /用于傳送和接收信號的代碼 ,Ring() . /用于顯示主叫號碼的代碼 ,Hang() . /用于結(jié)束會話的代碼

17、 ,31,3.4.1聲明方法,語法,訪問修飾符(可選),默認(rèn)情況下為 private,訪問修飾符 返回類型 (參數(shù)列表) / 方法主體 ,如果不需要返回任何值,方法需定義為void 數(shù)據(jù)類型,方法頭不是一條語句,其后不能跟分號“;”,“形式參數(shù)說明列表”是一個由逗號分隔開的列表,32,舉例:求任意兩個整數(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(請輸入您的姓名:); xm=Console.ReadLine(); for (i=1;i=5;i+) Console.WriteLine(“歡迎您,0同學(xué)。這里是C#編程世界!,xm); ,沒有返回值,要加上void,34,2、方法的調(diào)用 有三種格式: 【格式1】: 方法名(實際參數(shù)類表) 【格式2】: 對象名.方法名(實際參數(shù)類表) 【格式3】: 類名.方法名(實際參數(shù)類表) 格

19、式三只能調(diào)用非本類的另一個類的靜態(tài)方法。,35,【說明】: 1)調(diào)用方法時,如果方法有形式參數(shù),在調(diào)用時應(yīng)在“()”中使用實際參數(shù)。 2)沒有返回值的方法作為一條語句; 有返回值的方法方法的調(diào)用相當(dāng)于一個同類型的數(shù)據(jù),可以作為表達(dá)式或表達(dá)式的一部分參與運算。 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(請輸入兩個整數(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(請輸入您的姓名:); xm=Console.ReadLine(); for (i=1;i=5;i+) Console.WriteLine(“歡迎您,0同學(xué)。這里是C#編程世界!,xm); public static void Main() Welcome();/沒有返回值,當(dāng)成普通的指令訪問 ,38,3、參數(shù)的傳遞 參數(shù)傳遞實參把數(shù)據(jù)傳給形參的方式 C#中的參數(shù)傳遞可分為4種:值傳遞、引用傳遞、輸出參數(shù)和參數(shù)數(shù)組。 1)值傳遞 實參把值復(fù)制一份傳給形參,形參接受了實參的值后與實參已不存在任何聯(lián)系。 在方法中對形參的修改不會影響到對應(yīng)的實參,這種傳遞方式又稱為單向傳遞。 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(請輸入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ù)傳遞,(b)改變形參的值不會影響實參,可見實參把值傳遞給形參后,實參和形參之間不再存在聯(lián)系, 對形參的修改不會影響到對應(yīng)的實參值。,41,2)引用傳遞 和值參數(shù)不同,引用型參數(shù)并不開辟新的內(nèi)存區(qū)域,而是向方法傳遞實參在內(nèi)存中的地址。 形式參數(shù)的類型說明符前加上關(guān)鍵字ref 調(diào)用方法時,在實際參數(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(請輸入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ù)傳遞方式,僅用于從方法傳遞回一個結(jié)果,用關(guān)鍵字out表示。 與引用型參數(shù)類似,輸出型參數(shù)也不開辟新的內(nèi)存區(qū)域。 調(diào)用函數(shù)時,相應(yīng)實參前應(yīng)加關(guān)鍵字Out。 Example8.cs

25、,該函數(shù)相當(dāng)于可以有多個返回值,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ù)傳遞個數(shù)變化的參數(shù)。 要求如下: 參數(shù)數(shù)組必須位于形參列表的最后。 參數(shù)數(shù)組必須是一維數(shù)組。 不允許將params修飾符與ref和out修飾符組合起來使用。 與參數(shù)數(shù)組對應(yīng)的實參可以是同一類型的數(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#中,不能在一個方法中定義另一個方法,但c#中方法可以嵌套調(diào)用。,編寫一個函數(shù)求下列的函數(shù)值: s (x, n)=x/(1!+2!+3!+n!) 分析: 本例的關(guān)鍵是求分母:1!+2!+3!+n!,這是一個連加的式子,其關(guān)鍵是求第i項階乘。 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(請輸入x的值:); x=Convert.ToSingle(Console.ReadLine(); Console.WriteLine(請輸入n的值:); n=Convert.ToInt32(Console.ReadLine(); f=x/sum(n); Console.WriteLine(最后結(jié)果為:0,f); ,51,2)、方法的遞歸調(diào)用 C#中允許方法的遞歸調(diào)用,即在調(diào)用一個方法的過程中,又出

30、現(xiàn)了直接或間接地調(diào)用該方法本身。 例:若干人排成一個隊領(lǐng)蘋果,已知第一個領(lǐng)的蘋果數(shù)為1,從第二個人開始每個人領(lǐng)的蘋果是前一個人領(lǐng)的蘋果數(shù)的2倍再加3,問第n個人領(lǐng)了多少個蘋果? 遞歸函數(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)時用static修飾 不能用virtual、abstract或override修飾符。 非靜態(tài)方法可以訪問

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

32、double area(double a, double b)/求矩形面積,有兩個參數(shù) return (a * b); public double area(double a, double b, double c)/求三角形面積,有三個參數(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();/定義類的實例 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) 在一個有繼承關(guān)系的類層次結(jié)構(gòu)中,類中的方法由兩部分組成,一個是類體中聲明的方法,另一個則是直接從它的基類繼

34、承而來的方法。 但派生類很少會一成不變的繼承基類中所有的方法,如果需要對基類的方法作出修改,就要在派生類中對基類方法進(jìn)行覆蓋。(編譯時實現(xiàn)多態(tài)) 有兩種覆蓋方式: 一種是用關(guān)鍵字new修飾派生類中與基類同名的方法,這樣基類中的同名方法會被隱藏; 另一種更為靈活和有效的途徑是首先將基類的方法用關(guān)鍵字virtual修飾為虛擬方法,再由派生類用關(guān)鍵字override修飾同名的方法,表明是對基類的虛擬方法重載。(運行時多態(tài),動態(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、/派生類方法與基類,方法同名,編譯時會有警號信息 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 修飾符聲明一個虛方法,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,虛方法使用注意事項: 1)不能將虛方法聲明為靜態(tài)的,因為多態(tài)性是針對對象的,不是針對類的。 2)不能將虛方法聲明為

41、私有的,因為私有方法不能被派生類覆蓋。 3)覆蓋方法必須與它相關(guān)的虛方法匹配,也就是說,它們的方法簽名(方法名稱、參數(shù)個數(shù)、參數(shù)類型)、返回類型以及訪問屬性都應(yīng)該完全一致。,65,3.5、運算符重載,系統(tǒng)對大部分運算符都給出了常規(guī)定義 但可以根據(jù)需要給這些運算符賦予一個新的含義,這就是運算符的重載。,66,【格式】: 返回類型值 operator 運算符(運算對象列表) 重載的實現(xiàn)部分; 【說明】: 1)、返回類型可以是任意合法的C#類型修飾符,或自定義類型,在方法實現(xiàn)部分通過return語句返回該數(shù)據(jù)類型的數(shù)據(jù)。 2)、在C#中,可以重載的運算符主要有:+,-,!,+,-,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)/重載“+”運算符使之能夠?qū)蓚€復(fù)數(shù)進(jì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(); ,思考:請對復(fù)數(shù)運算符 和*重載(點乘返回值為double),Complex.cs,70,3.6 域與屬性,1、域又稱字段,它是類的一個成員,相當(dāng)于C+類中的一種簡單成員變量,而在C#中換了名字罷了

44、。 【格式】: 域修飾符 域類型名 域名; public double width;,71,【說明】: 1)修飾符有:new, public, protected, internal, private, static, readonly等。 2)在域定義時如果加上了readonly修飾符表明該域為只讀域。只讀域只能在域定義中及域所屬類的構(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; /錯誤,只讀域只能在定義時和構(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、屬性 屬性是對現(xiàn)實世界中實體特征的抽象,它提供了一種對類或?qū)ο筇卣鬟M(jìn)行訪問的機制。 如:一個窗口的標(biāo)題、一個控件的尺寸。 與域相比,屬性具有良好的封裝性。屬性不允許直接操作類的數(shù)據(jù)內(nèi)容,而是通過訪問器進(jìn)行訪問(使用get和set對屬性的值進(jìn)行讀寫)。,75,

47、【格式】: 屬性修飾符 類型說明符 屬性名 訪問聲明 【說明】: 1)屬性修飾符有new, public, protected, internal, private, static, virtual, override和abstract 9種。 2)訪問聲明用來聲明屬性訪問器。 set給屬性賦值 get獲取屬性值 如果只有g(shù)et訪問器,表示屬性只讀;如果只有set訪問器,表示只寫屬性;兩個都有,表示讀寫屬性。 3)get訪問函數(shù)是一個不帶參數(shù)的方法,它用于向外部返回屬性成員的值。通常訪問函數(shù)的語句或語句塊主要由return或throw語句返回某個變量成員的值。,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,可以通過屬性成員的訪問,訪問類中的某個變量(私有或公有),這樣就可以通過屬性成員把類本身與應(yīng)用該類

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

溫馨提示

  • 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

提交評論