《C#程序設(shè)計(jì)基礎(chǔ)》PPT課件.ppt
《《C#程序設(shè)計(jì)基礎(chǔ)》PPT課件.ppt》由會員分享,可在線閱讀,更多相關(guān)《《C#程序設(shè)計(jì)基礎(chǔ)》PPT課件.ppt(95頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、C#網(wǎng)絡(luò)應(yīng)用編程基礎(chǔ),主講教師:李璟 聯(lián)系電話:13806419626 E-mail: ,第三講 C#程序設(shè)計(jì)基礎(chǔ)(二),理解和掌握C#面向?qū)ο蠡揪幊谭椒ā?掌握繼承的編程方法。 掌握虛方法多態(tài)性編程。 重點(diǎn)和難點(diǎn):C#面向?qū)ο蠡揪幊谭椒?、繼承編程方法、虛方法多態(tài)性編程。,補(bǔ)充:C#數(shù)組的聲明與使用,數(shù)組用于存儲一組同類型的數(shù)據(jù)。 數(shù)組是按照數(shù)組名、元素類型和維數(shù)來描述的。一維數(shù)組在編程中經(jīng)常用到,下面僅介紹C#中一維數(shù)組的聲明與使用。 (1)一維數(shù)組的聲明 語法為:數(shù)據(jù)類型 數(shù)組名; 如:int myArray; 注意:區(qū)分C語言的數(shù)組定義語法為: 數(shù)據(jù)類型 數(shù)組名元素個(gè)數(shù); 如:in
2、t myArray10;,(2)一維數(shù)組的初始化,C#語言中數(shù)組在訪問之前必須先初始化。不能像下面這樣訪問數(shù)組或給數(shù)組賦值: int myIntArray; //只聲明但沒有初始化。 myIntArray10=5;//未初始化,不能訪問數(shù)組元素 數(shù)組的初始化有三種方式: 以字面形式指定數(shù)組的完整內(nèi)容。 如:string strArray1=C, C++, C#; Int intArr2=5,6,7; 指定數(shù)組的大小,并使用關(guān)鍵字new初始化所有的數(shù)組元素,會自動(dòng)給所有元素賦予同一個(gè)默認(rèn)值。 如: string strArray2=new string3; int intArr1=
3、new int4; 默認(rèn)值規(guī)則如下: 數(shù)值型:如int、double等,初始化為0。 bool類型:初始化為false. 引用類型:初始化為null。,一維數(shù)組的初始化(續(xù)),還可以使用以上兩種方式的組合,使用該方式,數(shù)組大小必須與元素個(gè)數(shù)相匹配。如: int intArr1=new int40,1,2,3; string mystring=new string3 “first”,”second”,”third”;,(3)一維數(shù)組的使用,數(shù)組元素的下標(biāo)是從0開始索引的。如,訪問共有32個(gè)元素?cái)?shù)組integers中的單個(gè)元素時(shí), integers0=23; //為第1個(gè)元素賦值 integer
4、s31=67; //為第32個(gè)元素賦值 integersi=90; //為第i+1個(gè)元素賦值 在C#中,由Array類提供創(chuàng)建、操作、搜索和排序數(shù)組的方法,因而在公共語言運(yùn)行庫中用作所有數(shù)組的基類。 Array類包括許多方法和屬性用于數(shù)組的操作,其中經(jīng)常使用的一個(gè)重要屬性是數(shù)組的長度Length。調(diào)用形式:數(shù)組名.Length。如: int Integers=2,6,-1,10,12; int ArrayLength=Integers.Length;,使用數(shù)組舉例,static void Main(string args) string friendNames=Robert, Mike, B
5、ob; int i; Console.WriteLine(Here are 0 of my friends:,friendNames.Length); for (i=0;i 6、類成員 3.1.3訪問修飾符 3.1.4字段 3.1.5構(gòu)造函數(shù) 3.1.6方法 3.1.7屬性 3.1.8類和對象定義和使用舉例,3.1.1 類的聲明,用class定義類,聲明類的簡單形式為: class 類名 //類體 字段聲明 構(gòu)造函數(shù) 屬性 方法 ,類聲明舉例 //下例聲明了兩個(gè)類,一個(gè)是Child類,另一個(gè)是用于數(shù)據(jù)處理的Program類。 class Child private string name; //字段 private string sex; //字段 // 構(gòu)造函數(shù) public Child(string name, string sex) 7、 this.name = name; this.sex=sex; //方法 public void PrintChild() Console.WriteLine(0, 1., name,sex); ,class Program static void Main(string args) Child child1=new Child(亮亮,男); child1.PrintChild(); Console.ReadLine(); 運(yùn)行結(jié)果: 亮亮,男.,3.1.2 類成員,在類中定義的數(shù)據(jù)和函數(shù)統(tǒng)稱為類的成員。類的成員包括數(shù)據(jù)成員和函數(shù)成員。 數(shù)據(jù)成員:是指在類中定義的數(shù)據(jù),包括 8、常量和字段。 函數(shù)成員:是指在類中定義的用于操作類中數(shù)據(jù)的函數(shù),主要包括構(gòu)造函數(shù)、方法、屬性。,類的常用成員描述,3.1.2類成員,類成員按是否為類所有對象共有,又分為靜態(tài)成員和實(shí)例成員。 靜態(tài)成員:屬于類,為類所有對象所共有,在內(nèi)存中只有一份,要等到應(yīng)用程序結(jié)束時(shí)才會退出內(nèi)存。定義時(shí),有static關(guān)鍵字。如: public static int j;//靜態(tài)字段 public static int GetNextSerialNo//靜態(tài)方法 實(shí)例成員:屬于類的實(shí)例,是只有創(chuàng)建了類的實(shí)例才能夠使用的成員。定義時(shí),沒有static關(guān)鍵字,如: public int j; //實(shí)例字段 9、public int GetSerialNo() //實(shí)例方法,3.1.3 訪問修飾符,類是封裝了數(shù)據(jù)及施加于數(shù)據(jù)上的操作的封裝體,其封裝性體現(xiàn)在外部類對本類成員的訪問權(quán)限是受到限制的,這種限制通過本類成員的訪問修飾符來實(shí)現(xiàn)。 C#語言中主要有以下幾種訪問修飾符。,類成員訪問修飾符舉例 class Child public int age; //公有字段 private string name; //私有字段 private string sex; //私有字段 // 構(gòu)造函數(shù) public Child(string name, int age,string sex) this.name = 10、name; this.age = age; this.sex=sex; //公有方法 public void PrintChild() Console.WriteLine(0, 1 ,2歲., name,sex,age); ,class Program static void Main(string args) Child child1=new Child(亮亮,1,男); child1.PrintChild(); child1.age=2;//age是公有字段,可以在外部訪問 child1.PrintChild(); Console.ReadLine(); 運(yùn)行結(jié)果: 亮亮,男,1歲 亮 11、亮,男,2歲,3.1.4 字段,字段:指類一級定義的變量。分靜態(tài)字段和實(shí)例字段。 字段的完整引用形式為: 引用靜態(tài)字段,形式為:類名.字段名 引用實(shí)例字段,形式為:實(shí)例名.字段名 注意:區(qū)分靜態(tài)字段和局部變量。 局部變量:指在構(gòu)造函數(shù)、方法內(nèi)定義的變量,局部變量的引用形式為:局部變量名 若字段名與局部變量不重名,則可以直接引用字段名。,字段與局部變量舉例,using System; namespace ConsoleAppVariable class Program public static int j=20; //靜態(tài)字段 public static int k=50; //靜態(tài)字段 12、 public int i; //實(shí)例字段 public static void Main() int j=30; //局部變量 int i=10; //局部變量 Console.WriteLine(局部變量:i=0,j=1,i,j); //局部變量:i=10,j=30 Program pro=new Program(); pro.i=5; Console.WriteLine(字段:i=0,j=1,k=2,pro.i,Program.j,k); //字段:i=5,j=20,k=50 Console.ReadLine(); 運(yùn)行結(jié)果: 局部變量:i=1 13、0,j=30 字段:i=5,j=20,k=50,3.1.5 構(gòu)造函數(shù),構(gòu)造函數(shù)是一個(gè)特殊的方法,用于在建立對象時(shí)進(jìn)行對對象的字段進(jìn)行初始化操作。 在C#中,每當(dāng)創(chuàng)建一個(gè)對象時(shí),都會先自動(dòng)調(diào)用類中定義的構(gòu)造函數(shù)。創(chuàng)建對象的形式如下: 類名 對象名=new 構(gòu)造函數(shù)(參數(shù)列表) 如:Child child1=new Child(“亮亮”,1,”男”) 使用構(gòu)造函數(shù)的好處是它能夠確保每一個(gè)對象在被使用之前都適當(dāng)?shù)剡M(jìn)行了初始化。 在C#中,沒有析構(gòu)函數(shù),該對象所占的內(nèi)存將被CLR在適當(dāng)時(shí)間自動(dòng)回收(垃圾回收機(jī)制)。,構(gòu)造函數(shù)基本特點(diǎn),構(gòu)造函數(shù)具有以下基本特點(diǎn): 1) 每個(gè)類至少有 14、一個(gè)構(gòu)造函數(shù)。若程序代碼中沒有構(gòu)造函數(shù)則系統(tǒng)會自動(dòng)提供一個(gè)默認(rèn)的構(gòu)造函數(shù)。 2) 一個(gè)構(gòu)造函數(shù)必須和它的類名相同。 3) 構(gòu)造函數(shù)不包含任何返回值。,構(gòu)造函數(shù)默認(rèn)構(gòu)造函數(shù),1. 默認(rèn)構(gòu)造函數(shù) (1)如果在類中不定義構(gòu)造函數(shù),系統(tǒng)會提供一個(gè)默認(rèn)的構(gòu)造函數(shù)。 (2)默認(rèn)構(gòu)造函數(shù)沒有參數(shù)。 (3)默認(rèn)構(gòu)造函數(shù)自動(dòng)將實(shí)例字段初始化為: 數(shù)值型:如int、double等,初始化為0。 bool類型:初始化為false. 引用類型:初始化為null。 (4)如果自己定義了構(gòu)造函數(shù),則不會自動(dòng)進(jìn)行初始化。,構(gòu)造函數(shù)重載構(gòu)造函數(shù),2. 重載構(gòu)造函數(shù) 實(shí)際情況中,構(gòu)造函數(shù)中需要傳入的參數(shù)的數(shù)目和類型 15、不同。解決這個(gè)問題最好的辦法就是:重載(Overloading)構(gòu)造函數(shù)。 方法重載是指允許在同一類中采用同一名稱不同簽名聲明多個(gè)方法。當(dāng)編譯一個(gè)重載方法的調(diào)用時(shí),編譯器會自動(dòng)找到最佳匹配自變量的方法,否則報(bào)錯(cuò)。 注:方法的簽名由它的名稱、參數(shù)的數(shù)目、每個(gè)參數(shù)的類型組成。返回值類型不是方法簽名的組成部分。,構(gòu)造函數(shù)舉例,class Program public Program() Console.WriteLine(null); public Program(string str) Console.WriteLine(string str=0,str); public Progra 16、m(int x) Console.WriteLine(int x=0 ,x); static void Main() Program aa = new Program(); Program bb = new Program(How are you!); Program cc = new Program(10); Console.ReadLine(); 運(yùn)行結(jié)果: null How are you! int x=10,3.1.6 方法,方法(Method)是一種用于操作對象或類的數(shù)據(jù)成員完成某種功能的函數(shù)成員。 1. 方法的定義與使用 (1)方法必須放在某個(gè)類中。 (2)定義方法的語法形式 17、為: 訪問修飾符 返回值類型 方法名(參數(shù)列表) 語句序列 ,方法可以有參數(shù),也可以沒有參數(shù),但是小括號都是必需的。若參數(shù)有多個(gè),用逗號分開。 無返回值時(shí),必須聲明方法的返回值類型為void。 如果聲明一個(gè)非void類型的方法,則方法中必須至少有一個(gè)return語句并返回一個(gè)值。,定義方法的注意事項(xiàng),類方法舉例: class Program public int IntMethod() Console.WriteLine(this is IntMethod.); int i = 10; return i ; public void VoidMethod() Console.Wri 18、teLine(this is VoidMethod.); static void Main() Program method = new Program(); int j = 5; method.VoidMethod(); Console.WriteLine(j=0., j); j = method.IntMethod(); Console.WriteLine(j=0., j); Console.ReadLine(); 運(yùn)行結(jié)果: this is VoidMethod. j=5 this is IntMethod. j=10,方法--參數(shù)傳遞,2. 方法中的參數(shù)傳遞 1)值參數(shù) 2)引用 19、參數(shù) 3)輸出參數(shù) 4)參數(shù)數(shù)組 前三種用于參數(shù)個(gè)數(shù)確定的情況。 第四種用于參數(shù)類型相同、參數(shù)個(gè)數(shù)不確定的情況,用一個(gè)參數(shù)數(shù)組傳遞多個(gè)同類型的參數(shù)。,方法--參數(shù)傳遞,值參數(shù) 格式: 參數(shù)類型 參數(shù)名 值參數(shù)用于輸入?yún)?shù)的傳遞。值參數(shù)相當(dāng)于一個(gè)局部變量,它的初始值是從為該參數(shù)所傳遞的自變量或常量獲得的。對值參數(shù)的修改不會影響所傳遞的自變量。,值參數(shù)舉例,class Program public static void AddOne(int a) a++; static void Main() int x = 3; Console.WriteLine(調(diào)用AddO 20、ne之前,x=0, x);//x=3 AddOne(x); Console.WriteLine(調(diào)用AddOne之后,x=0, x);//x=3 Console.ReadLine(); 運(yùn)行結(jié)果: 調(diào)用AddOne之前, x=3 調(diào)用AddOne之后, x=3,方法--參數(shù)傳遞,2) 引用參數(shù) 格式為: ref 參數(shù)類型 參數(shù)名 用于輸入和輸出參數(shù)的傳遞。用于引用參數(shù)的自變量必須是一個(gè)變量,并且在方法執(zhí)行期間,引用參數(shù)和自變量所表示的是同一個(gè)存儲位置。因此該引用參數(shù)既是輸入?yún)?shù)又是輸出參數(shù)。,參數(shù)傳遞舉例,class Program public static vo 21、id AddOne(ref int a) a++; static void Main() int x = 3; Console.WriteLine(調(diào)用AddOne之前,x=0, x); AddOne(ref x); Console.WriteLine(調(diào)用AddOne之后,x=0, x); Console.ReadLine(); 運(yùn)行結(jié)果: x=3 x=4,方法參數(shù)傳遞,3) 輸出參數(shù) 格式為: out 參數(shù)類型 參數(shù)名 用于輸出參數(shù)的傳遞。輸出參數(shù)類似于引用參數(shù),不同之處在于調(diào)用方提供的自變量并不作為輸入?yún)?shù),其初始值無關(guān)緊要。,輸出參數(shù)舉例,cl 22、ass Program public static void Divide(int x,int y,out int result, out int remainder) result = x/y; remainder = x%y; static void Main() int res, rem; Divide (10,3,out res, out rem); Console.WriteLine(“調(diào)用Divide之后,res=0,rem=1,res, rem); Console.ReadLine(); 運(yùn)行結(jié)果: 調(diào)用Divide之后,res=3,rem=1 23、,方法--參數(shù)傳遞,4) 參數(shù)數(shù)組(傳遞個(gè)數(shù)不確定的同類型參數(shù)) 格式為: params 參數(shù)數(shù)組類型 數(shù)組名 參數(shù)數(shù)組允許將可變長的自變量列表傳遞給方法。 注意:采用params關(guān)鍵字聲明參數(shù)的個(gè)數(shù)是不確定的。,參數(shù)數(shù)組舉例,class Program public static float Average(params long data) long total=0, i; for (i = 0; i < data.Length; ++i) total += datai; return (float)total / data.Length; 24、 static void Main() float x = Average(1, 2, 3, 5); Console.WriteLine(1+2+3+5的平均值為0, x); x = Average(4, 5, 6, 7, 8); Console.WriteLine(4+5+6+7+8的平均值為0, x); Console.ReadLine(); 運(yùn)行結(jié)果: 1+2+3+5的平均值為2.75 4+5+6+7+8的平均值為6,方法--靜態(tài)方法與實(shí)例方法,靜態(tài)方法 若一個(gè)方法聲明中含有static修飾符,則稱該方法為靜態(tài)方法。 靜態(tài)方法不對實(shí)例成員進(jìn)行操作,只能 25、訪問靜態(tài)成員。 靜態(tài)方法調(diào)用形式:類名.靜態(tài)方法名 實(shí)例方法 若一個(gè)方法聲名中沒有static修飾符,則稱為該方法為實(shí)例方法。 實(shí)例方法既能訪問靜態(tài)成員,也能訪問實(shí)例成員。 實(shí)例方法調(diào)用形式:實(shí)例名.實(shí)例方法名 靜態(tài)方法的好處在于不用創(chuàng)建類實(shí)例僅通過類就能調(diào)用。,例:設(shè)計(jì)一個(gè)Entity類(實(shí)體類),設(shè)置一個(gè)靜態(tài)字段保存下一個(gè)序列號(初始值為1000),設(shè)置一個(gè)實(shí)例字段保存實(shí)例當(dāng)前的序列號,每個(gè)類對象在創(chuàng)建時(shí)自動(dòng)獲取一個(gè)唯一序列號并使下一個(gè)序列號自動(dòng)加1。 分析: 設(shè)計(jì)兩個(gè)字段: 靜態(tài)字段nextSerialNo ,保存下個(gè)序列號。 實(shí)例字段serialNo,保存當(dāng)前實(shí)例序列號。 設(shè)計(jì)以下方法 26、: 構(gòu)造方法Entity( ),初始化當(dāng)前實(shí)例的序列號。 實(shí)例方法GetSerialNo( ),獲取當(dāng)前實(shí)例序列號。 靜態(tài)方法SetNextSerialNo(int value),設(shè)置下一個(gè)序列號初值。 靜態(tài)方法GetNextSerialNo( ),獲取下一個(gè)序列號,靜態(tài)方法和實(shí)例方法舉例,class Entity static int nextSerialNo; //靜態(tài)字段,保存下個(gè)序列號 int serialNo; //實(shí)例字段,保存當(dāng)前實(shí)例序列號 public Entity( ) //構(gòu)造函數(shù) serialNo=nextSerialNo++; public int Ge 27、tSerialNo( ) //實(shí)例方法 return serialNo; //獲取當(dāng)前實(shí)例序列號 public static int GetNextSerialNo( ) //靜態(tài)方法 return nextserialNo; //獲取下個(gè)序列號 public static void SetNextSerialNo(int value) //靜態(tài)方法 nextserialNo=value; //設(shè)置下個(gè)序列號初值 ,靜態(tài)方法和實(shí)例方法舉例,static void Main() Entity.SetNextSerialNo(1000); Entity e1=new 28、 Entity(); Entity e2=new Entity(); Console.WriteLine(e1.GetSerialNo()); Console.WriteLine(e2.GetSerialNo()); Console.WriteLine(Entity.GetNextSerialNo()); 運(yùn)行結(jié)果: 1000 1001 1002,靜態(tài)方法和實(shí)例方法舉例,方法--方法重載,4. 方法重載 有時(shí)會遇到完成相似的功能,但傳入的參數(shù)列表不同的情況,C#使用方法重載來實(shí)現(xiàn)統(tǒng)一操作。 方法重載是指具有相同的方法名,但簽名不同的多個(gè)方法可以同時(shí)出現(xiàn)在一個(gè)類中。當(dāng) 29、編譯一個(gè)重載方法的調(diào)用時(shí),編譯器會自動(dòng)找到最佳匹配自變量的方法,否則報(bào)錯(cuò)。,方法重載舉例,class Program public static int Add(int i, int j) return i + j; public static string Add(string s1, string s2) return s1 + s2; public static long Add(long x) return x + 5; static void Main() Console.WriteLine(Add(1, 2)); Console 30、.WriteLine(Add(1, 2)); Console.WriteLine(Add(10)); Console.ReadLine(); 運(yùn)行結(jié)果: 3 12 15,3.1.7 屬性,一個(gè)設(shè)計(jì)良好的類不僅僅要將類的實(shí)現(xiàn)部分隱藏起來,還會限制外部對類中非公有字段的存取權(quán)限。在C#中,可以通過屬性來實(shí)現(xiàn)。,1.屬性的聲明,屬性的聲明類似字段,不同之處在于屬性的聲明以定界符之間的get訪問器和/或set訪問器結(jié)束,而不是分號。 get訪問器和set訪問器不是必須同時(shí)有的,因需而定。 get訪問器相當(dāng)于一個(gè)具有屬性類型返回值的無參數(shù)方法,用來有限制地讀取類中非公有字段的值。 se 31、t訪問器相當(dāng)于一個(gè)具有單個(gè)名為value的參數(shù)和無返回類型的方法,用來有限制地設(shè)置類中非公有字段的值。,屬性舉例,class MyClass private int number = 0; public int Number get return number; set if (value 0) //value是關(guān)鍵字,其值是調(diào)用set訪問器時(shí)傳入的新值。 number = value; ,屬性舉例,class Program public static void Main() 32、 MyClass me = new MyClass(); Console.WriteLine(me.Number);//調(diào)用get訪問器 me.Number = 5;//調(diào)用set訪問器,value=5 Console.WriteLine(me.Number); //調(diào)用get訪問器 Console.ReadLine(); 運(yùn)行結(jié)果: 0 5,2. 屬性與方法的區(qū)別,1) 屬性不使用括號,但方法一定要使用括號。 2) 屬性不能指定參數(shù),方法可以指定參數(shù)。 3) 屬性不能使用void類型,方法則可以使用void類型。,3.1.8 類和對象定義和使用舉例,設(shè)計(jì)一個(gè)公 33、司雇員類(employee),需要存儲這些雇員的姓名name、編號(編號初始值缺省為1000),并設(shè)計(jì)以下功能: 為姓名name定義屬性,設(shè)置其get訪問器和set訪問器。 實(shí)現(xiàn)無參構(gòu)造方法,完成從鍵盤上輸入雇員姓名的功能。 實(shí)現(xiàn)方法,完成從鍵盤上重新設(shè)置編號初始值的功能(setEmployeeNo)。 實(shí)現(xiàn)方法顯示雇員編號和姓名(displayStatus)。,class employee private string name; //姓名 private int individualEmpNo; //個(gè)人編號 private static int employeeNo=1000; 34、 //雇員編號目前最大值 public string Name get return name; set if(value!=) name=value; ,public employee() //構(gòu)造方法 Console.Write(請輸入一個(gè)雇員的姓名:); name=Console.ReadLine(); individualEmpNo=employeeNo++; static public void setEmployeeNo() Console.Write(請輸入雇員編號目前的初始值:); employeeNo=Convert.ToInt32(Co 35、nsole.ReadLine()); public void displayStatus() //顯示人員信息 Console.WriteLine(“編號:”+individualEmpNo+“,姓名:+name); ,class Program static void Main(string args) employee.setEmployeeNo(); employee employee1=new employee(); employee1.displayStatus(); employee employee2=new employee(); employee2.d 36、isplayStatus(); Console.Write(請重新輸入最后一個(gè)雇員的姓名:); employee2.Name=Console.ReadLine(); employee2.displayStatus(); Console.ReadLine(); 運(yùn)行結(jié)果: 請輸入雇員編號目前的初始值:1000 請輸入一個(gè)雇員的姓名:王麗 編號:1000,姓名:王麗 請輸入一個(gè)雇員的姓名:劉強(qiáng) 編號:1001,姓名:劉強(qiáng) 請重新輸入最后一個(gè)雇員的姓名:張剛 編號:1001,姓名:張剛,3.2 面向?qū)ο蟮母呒壘幊?3.2.1封裝 3.2.2繼承 3.2.3多態(tài)性,3.2.1 封裝,在面向?qū)?/p>
37、象編程中,封裝是指把數(shù)據(jù)和處理這些數(shù)據(jù)的代碼封裝在一個(gè)類中,盡可能隱藏實(shí)現(xiàn)的細(xì)節(jié),只提供給調(diào)用者需要知道的操作和數(shù)據(jù)。 封裝使得外部類并不能直接訪問類內(nèi)部數(shù)據(jù),只有類內(nèi)部操作才能訪問類內(nèi)部數(shù)據(jù),所以設(shè)計(jì)者修改實(shí)現(xiàn)細(xì)節(jié)時(shí),只要不改變對外接口,可以不影響調(diào)用者與類的交互方式。,類封裝舉例:設(shè)計(jì)一個(gè)銀行賬戶類,通過屬性讀取賬戶余額但不可任意修改賬戶余額,通過構(gòu)造方法初始化賬戶余額,并可以通過方法扣減賬戶余額,在控制臺應(yīng)用程序中測試該類的功能。,分析:根據(jù)題意設(shè)計(jì)一個(gè)名為BankAccount的類,該類有: 一個(gè)私有字段accountBalance保存賬戶余額。 一個(gè)名為AccountBalance的 38、屬性,只提供get訪問器不提供set訪問器。 一個(gè)名為BankAccount的構(gòu)造方法,可初始化帳戶余額accountBalance。 一個(gè)名為Withdraw的公有方法,可以扣減帳戶余額accountBalance的值。,class BankAccount private decimal accountBanlance; public decimal AccountBanlance get return accountBanlance; public BankAccount(decimal startAmount) accountBanlance=startAmount; p 39、ublic void Withdraw(decimal money) if(accountBanlance=money) accountBanlance-=money; Console.WriteLine(扣掉0:C,money); ,class Program static void Main() BankAccount ZhangSan=new BankAccount(1000); Console.WriteLine(賬戶的余額為0:C,ZhangSan.AccountBanlance); ZhangSan.Withdraw(100); Console.W 40、riteLine(賬戶的余額為0:C,ZhangSan.AccountBanlance); Console.ReadLine(); 運(yùn)行結(jié)果: 帳戶的余額為¥1,000.00 扣掉¥100.00 帳戶的余額為¥900.00,若上題中增加一個(gè)修改:若一次扣款超過500元,就提示“每次扣款額不能超過500元!”,則僅需修改類內(nèi)方法Withdraw方法,修改如下: public void Withdraw(decimal money) if(accountBanlance=money) if(money=500.00) Console.WriteLine(每次扣款額不能超 41、過500元! ); return; else accountBanlance-=money; Console.WriteLine(扣掉0:C,money); ,3.2.2 繼承,繼承的概念來自于遺傳與分類, 遺傳:每個(gè)人的特征或多或少都來自于父母的遺傳,但每個(gè)人都不可能完全與父母一模一樣,有著自己與眾不同的特征。 分類:現(xiàn)實(shí)世界中的事物都是相互聯(lián)系的,人們在認(rèn)識過程中,根據(jù)他們的實(shí)際特征,抓住其共同特征和細(xì)小差別,利用分類的方法進(jìn)行分析和描述他們。,3.2.2 繼承,3.2.2.1 繼承的概念 3.2.2.2 C#派生類的聲明 3.2.2.3 42、 C#派生類中的構(gòu)造方法,3.2.2.1繼承的概念,在現(xiàn)實(shí)世界中,許多實(shí)體或概念不是孤立的,它們具有共同的特征,但也有細(xì)微的差別,人們使用層次分類的方法來描述這些實(shí)體或概念之間的相似點(diǎn)和不同點(diǎn)。 繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)中最重要的機(jī)制,它支持層次分類的觀點(diǎn)。 繼承使得程序員可以在一個(gè)較一般的類的基礎(chǔ)上很快地建立一個(gè)新類,而不必從零開始設(shè)計(jì)每個(gè)類。,基類和派生類的關(guān)系,在OOP中,繼承使得派生類具有基類的特征,同時(shí)又允許在派生類的聲明時(shí)增加自己的特征,或修改基類的特征。,3.2.2.2 C#派生類的聲明,聲明一個(gè)C#派生類的一般格式為: class 派生類名: 基類名 //派生類新增的數(shù)據(jù)成員 43、和成員函數(shù) ; 其中,“基類名”是一個(gè)已經(jīng)定義的類的名稱,“派生類名”是繼承原有類的特性而生成的新類的名稱。,3.2.2.3 C#派生類中的構(gòu)造方法,基類的構(gòu)造函數(shù)不能被繼承,派生類必須自身的構(gòu)造函數(shù)。 在派生類中對新增成員的初始化工作,是由派生類的構(gòu)造函數(shù)完成的。 在派生類中對基類成員的初始化工作,還是由基類的構(gòu)造函數(shù)完成。 我們必須在派生類的構(gòu)造函數(shù)中對基類的構(gòu)造函數(shù)所需要的參數(shù)進(jìn)行設(shè)置。 通常情況下,當(dāng)創(chuàng)建派生類對象時(shí),首先執(zhí)行基類的構(gòu)造函數(shù),隨后再執(zhí)行派生類的構(gòu)造函數(shù)。,派生類構(gòu)造函數(shù)的一般格式,派生類名(參數(shù)總表):base(參數(shù)表) // 派生類新增成員的初始化語句 默認(rèn)情況下, 44、派生類的所有構(gòu)造函數(shù)會自動(dòng)調(diào)用基類的無參構(gòu)造函數(shù)。 當(dāng)派生類的有參構(gòu)造函數(shù)需要調(diào)用基類的有參構(gòu)造函數(shù)時(shí),需要在定義派生類構(gòu)造函數(shù)時(shí),綴上基類名base及其有參構(gòu)造函數(shù)的初始化列表。如: public Car(int w, float g, int p, string id):base(w,g,p,id),例 派生類構(gòu)造函數(shù)默認(rèn)情況下自動(dòng)調(diào)用基類的無參構(gòu)造函數(shù),class Animal protected string _name; public Animal() Console.WriteLine(你好,我是一只動(dòng)物!); public Animal(string name 45、) _name = name; Console.WriteLine(你好,我是一只動(dòng)物!我的名字叫 + _name + !); public void Eat() Console.WriteLine(_name + 在吃食!); class Cat : Animal public Cat() Console.WriteLine(你好,我是一只貓!); public Cat(string name) _name = name; Console.WriteLine(你好,我是一只貓!我的名字叫 + _name + !); ,class Prog 46、ram static void Main() Cat e = new Cat(小白); e.Eat(); Cat h = new Cat(); Console.ReadLine(); 運(yùn)行結(jié)果: 你好,我是一只動(dòng)物! 你好,我是一只貓!我的名字叫小白! 小白在吃食! 你好!我是一只動(dòng)物! 你好!我是一只貓! 說明:該例中Cat的兩個(gè)構(gòu)造函數(shù)都自動(dòng)調(diào)用了基類Animal的無參構(gòu)造Animal()。,例 派生類構(gòu)造函數(shù)調(diào)用指定的基類有參構(gòu)造函數(shù),class Animal protected string _name; public Animal() 47、Console.WriteLine(你好,我是一只動(dòng)物!); public Animal(string name) _name = name; Console.WriteLine(你好,我是一只動(dòng)物!我的名字叫 + _name + !); public void Eat() Console.WriteLine(_name + 在吃食!); class Cat : Animal public Cat() Console.WriteLine(你好,我是一只貓!); public Cat(string name):base(name) _name = 48、 name; Console.WriteLine(你好,我是一只貓!我的名字叫 + _name + !); ,class Program static void Main() Cat e = new Cat(小白); e.Eat(); Cat h = new Cat(); Console.ReadLine(); 運(yùn)行結(jié)果: 你好,我是一只動(dòng)物!我的名字叫小白! 你好,我是一只貓!我的名字叫小白! 小白在吃食! 你好!我是一只動(dòng)物! 你好!我是一只貓! 說明: 在該例中,Cat(string name)調(diào)用了基類Animal中的有參構(gòu)造函數(shù)Animal( 49、string name)。,3.2.3 多態(tài)性,C#最重要的特征之一就是代碼重用。多數(shù)情況下,越通用的代碼越能夠重用。 多態(tài)性是通過提高代碼的通用性來實(shí)現(xiàn)代碼重用的。 直觀地講,多態(tài)性是指類族中具有相似功能的不同函數(shù)使用同一名稱來實(shí)現(xiàn),從而可以使用相同的調(diào)用方式來調(diào)用這些具有不同功能的同名函數(shù),即通過用相同的接口訪問不同功能的函數(shù),來實(shí)現(xiàn)“一個(gè)接口,多種方法”的通用性。 (注:類族是指由直接或間接派生自共同基類的所有派生類和共同基類組成的類的集合。) 從消息的角度說,多態(tài)性是指同樣的消息被不同類型的對象接收時(shí)導(dǎo)致完全不同的行為。,C#多態(tài)性的實(shí)現(xiàn)方式,主要有以下幾種實(shí)現(xiàn)多態(tài)性的方式。 第一種方 50、式是通過繼承實(shí)現(xiàn)多態(tài)性,分為兩種: 1. 虛方法 2. 隱藏基類的方法 第二種方式是通過抽象類實(shí)現(xiàn)多態(tài)性。,3.2.3 多態(tài)性,3.2.3.1 虛方法 3.2.3.2 隱藏基類的方法 3.2.3.3 抽象類,3.2.3.1 虛方法,在基類中,如果想讓某個(gè)方法被派生類重寫,可以使用修飾符virtual聲明該方法為虛方法,形式如下: public virtual 返回值類型 方法名() //程序代碼 派生類則用override重寫,形式如下: public override返回值類型 方法名() //程序代碼 ,虛函數(shù),例如,如果在基類中,如果想讓方法myMethod被派生類重寫,可 51、以使用修飾符virtual聲明: public virtual void myMethod() //程序代碼 派生類則用override重寫: public override void myMethod() //程序代碼 ,使用虛方法與重寫方法時(shí),需要注意下面幾個(gè)方面: 1) 虛方法不能聲明為靜態(tài)(static)的。因?yàn)殪o態(tài)的方法是應(yīng)用在類這一層次的,而多態(tài)性只能在對象上運(yùn)作。 2) virtual不能和private一起使用。因?yàn)槁暶鳛閜rivate就無法在派生類中重寫了。 3) 重寫方法的名稱、參數(shù)個(gè)數(shù)、類型以及返回值都必須和虛方法的一致。 4)虛方法在派生類中不是必須被重寫 52、的,不重寫時(shí),派生類將自動(dòng)調(diào)用虛方法在基類中的版本。,例 利用虛方法多態(tài)性編寫汽車信息管理程序,class Vehicle //定義車基類 protected int passengers; //乘客數(shù) protected int wheels; //輪子個(gè)數(shù) protected float weight; //重量 protected string videntifier;//標(biāo)志 public Vehicle(int w, float g, int p, string id) wheels = w; weight = g; videntifier = 53、 id; passengers = p; public virtual Speak() public void Print() Console.WriteLine(乘客數(shù): +passengers); Console.WriteLine(輪子數(shù): +wheels); Console.WriteLine(重量:+weight); Console.WriteLine(標(biāo)志: +videntifier); ,class Truck:Vehicle //定義卡車類 private float load; //私有成員:載重量 publi 54、c Truck(int w, float g, int p, float l, string id): base(w, g, p, id) load = l; public override void Speak() Console.WriteLine(卡車鳴笛:叭叭叭叭!); public new void Print() base.Print(); Console.WriteLine(載重: +load); ,class Car : Vehicle //定義轎車類 public Car(int w, float g, int 55、 p, string id):base(w,g,p,id) public override void Speak() Console.WriteLine(轎車鳴笛:嘀嘀嘀嘀!); class Bus:Vehicle //定義公共汽車類 public Bus(int w, float g, int p, string id): base(w, g, p, id) public override void Speak() Console.WriteLine(公共汽車鳴笛:嘟嘟嘟嘟!); ,class Program static void Main(stri 56、ng args) //乘客數(shù) 輪子數(shù) 重量 Car c1 = new Car(4, 2, 5, 標(biāo)志307); //乘客數(shù) 輪子數(shù) 重量 載重量 Truck t1 = new Truck(6, 5, 3, 10, 解放); Bus b1 = new Bus(4, 3, 40, 金杯); //轎車 Console.WriteLine(///////////////////); Console.WriteLine(轎車信息:); c1.Speak(); c1.Print(); //嘀嘀 //卡車 Console.WriteLine( 57、///////////////////); Console.WriteLine(卡車信息:); t1.Speak(); t1.Print(); //叭叭 //公共汽車 Console.WriteLine(///////////////////); Console.WriteLine(公共汽車信息:); b1.Speak(); b1.Print(); //嘟嘟 Console.WriteLine(///////////////////); Console.ReadLine(); ,3.2.3.2 隱藏基類的方法,在派生類中,可以使用new關(guān)鍵 58、字來隱藏基類的方法,即使用一個(gè)完全不同的方法取代舊的方法。 與方法重寫不同的是,使用new關(guān)鍵字時(shí)并不要求基類中的方法聲明為virtual,只要在派生類的方法前聲明為new,就可以隱藏基類的方法。,例 隱藏基類的方法,class Hello public void SayHello() Console.WriteLine(這是基類!); class NewHello : Hello public new void SayHello() Console.WriteLine(“這是派生類!); ,class Program static void Main(string arg 59、s) Hello b = new Hello(); b.SayHello(); NewHello d = new NewHello(); d.SayHello(); Console.ReadLine(); 運(yùn)行結(jié)果: 這是基類! 這是派生類!,3.2.3.3 抽象類,利用抽象類,可以聲明僅定義了部分實(shí)現(xiàn)的類,讓派生類提供某些或者全部方法的實(shí)現(xiàn)。 如果對于給定類型的大多數(shù)或者全部對象來說,某些行為是既定的,而有些行為只是對一個(gè)特定類有意義時(shí),抽象類就很有幫助。 抽象類是至少帶有一個(gè)抽象方法的類。,抽象方法,抽象方法是一個(gè)在基類中只說明函數(shù)原型以規(guī)定整個(gè)類族的統(tǒng)一接口形式的 60、虛方法。 抽象方法在該基類中沒有定義具體的操作內(nèi)容,但要求在各派生類中根據(jù)實(shí)際需要定義自己的版本。 聲明為抽象方法之后,基類中就不再給出函數(shù)的實(shí)現(xiàn)部分。抽象方法的函數(shù)體由派生類給出。,抽象方法的聲明與實(shí)現(xiàn)形式,(1)抽象方法的聲明形式如下: abstract 方法類型 方法名(參數(shù)表); 如: abstract void show(); (2)抽象方法在派生類中被實(shí)現(xiàn)的形式為: public override 返回類型 方法名() //方法體 如: public override void show() //方法體 ,抽象類,至少帶有一個(gè)抽象方法的類是抽象類。 抽象類的主要作用是通過它 61、為一個(gè)類族建立一個(gè)公共的接口,使它們能夠更有效地發(fā)揮多態(tài)特性。 抽象類聲明了一系列派生類的公共接口,而接口的完整實(shí)現(xiàn),即抽象方法的函數(shù)體,要由派生類自己定義。 抽象類派生出新的類之后, 如果派生類給出所有抽象方法的函數(shù)實(shí)現(xiàn),這個(gè)派生類就可以聲明自己的對象,不再是抽象類,可以實(shí)例化; 反之,如果派生類沒有給出全部抽象函數(shù)的實(shí)現(xiàn),這時(shí)的派生類仍然是一個(gè)抽象類,不能實(shí)例化。,抽象類的聲明形式,抽象類使用abstract修飾符,聲明形式如下: abstract class 類名 public abstract 返回值類型 抽象方法名(); 如: abstract class Shape 62、 public abstract void Rotate();//抽象方法 ,抽象類與非抽象類的主要不同:,第一是抽象類不能直接被實(shí)例化,只能在派生類中通過繼承使用。 第二是抽象類可以包含抽象成員,而非抽象類不能包含抽象成員。當(dāng)從抽象類派生非抽象類時(shí),這些非抽象類必須具體實(shí)現(xiàn)所繼承的所有抽象成員。,例 抽象方法和抽象類,abstract class Shape public virtual void Draw() Console.WriteLine(畫一種圖形!); public abstract void Rotate();//抽象方法 class Square : Sh 63、ape public override void Draw() Console.WriteLine(畫一個(gè)正方形!); public override void Rotate() Console.WriteLine(順時(shí)針方向旋轉(zhuǎn)正方形!); ,class Program static void Main(string args) Square me = new Square(); me.Draw(); me.Rotate(); Console.ReadLine(); 運(yùn)行結(jié)果: 畫一個(gè)正方形! 順時(shí)針方向旋轉(zhuǎn)正方形!,例 利 64、用抽象類多態(tài)性編寫汽車信息管理程序,abstract class Vehicle //定義車基類 protected int passengers; //乘客數(shù) protected int wheels; //輪子個(gè)數(shù) protected float weight; //重量 protected string videntifier;//標(biāo)志 public Vehicle(int w, float g, int p, string id) wheels = w; weight = g; videntifier = id; passengers = 65、p; public abstract Speak(); //抽象方法 public void Print() Console.WriteLine(乘客數(shù): +passengers); Console.WriteLine(輪子數(shù): +wheels); Console.WriteLine(重量:+weight); Console.WriteLine(標(biāo)志: +videntifier); ,class Truck:Vehicle //定義卡車類 private float load; //私有成員:載重量 public Truck(int w 66、, float g, int p, float l, string id): base(w, g, p, id) load = l; public override void Speak() Console.WriteLine(卡車鳴笛:叭叭叭叭!); public new void Print() base.Print(); Console.WriteLine(栽重: +load); ,class Car : Vehicle //定義轎車類 public Car(int w, float g, int p, string id):base(w,g,p,id) public override void Speak() Console.WriteLine(轎車鳴笛:嘀嘀嘀嘀!); class Bus:Vehicle //定義公共汽車類 public Bus(int w, float g, int p, string id): base(w, g, p, id) public override
- 溫馨提示:
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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點(diǎn)美食推薦
- XX國有企業(yè)黨委書記個(gè)人述責(zé)述廉報(bào)告及2025年重點(diǎn)工作計(jì)劃
- 世界濕地日濕地的含義及價(jià)值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點(diǎn)節(jié)后常見的八大危險(xiǎn)
- 廈門城市旅游介紹廈門景點(diǎn)介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點(diǎn)推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個(gè)個(gè)會應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點(diǎn)
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案