第五講-面向對象編程二繼承封裝和多態(tài)_第1頁
第五講-面向對象編程二繼承封裝和多態(tài)_第2頁
第五講-面向對象編程二繼承封裝和多態(tài)_第3頁
第五講-面向對象編程二繼承封裝和多態(tài)_第4頁
第五講-面向對象編程二繼承封裝和多態(tài)_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第五講 面向對象編程(二)繼承、封裝和多態(tài)14.3 繼承、封裝和多態(tài)4.3.1 繼承4.3.2 封裝4.3.3 多態(tài)4.3.4 this和base關鍵字24.3.1 類的繼承 繼承的意思是一個類可以建立在另一個類的基礎上,可以繼承另一個類的屬性和方法。我們把被繼承的類叫做基類,通過繼承產生的類叫做派生類(也可以叫做父類和子類)。繼承的概念來源與現實的生活,比如汽車、輪船、火車飛機等就是繼承于交通工具這個類,而汽車類中又可以派生出新的類,比如轎車、面包車等等。 引入繼承可以讓我們重用以前寫過的代碼,新編寫的代碼可以在原來的基礎上繼承而來。 在C#中繼承的方式就是定義派生類。 在C#中,所有的類都

2、是通過直接或間接地繼承Object類得到的。31. 派生子類定義派生類的基本形式:class 派生類名字:基類名字 派生類的代碼;public class Parent public Parent( ) .定義一個構造函數 public void WriteItem( ) .定義方法 public class Child:Parent public Child( ) . 派生類的構造函數 public static void Main( ) Child a=new Child( ); a.WriteItem( ); 派生類使用基類的方法基類的構造函數先執(zhí)行再執(zhí)行派生類的構造函數。42. 域的繼

3、承、添加與隱藏1、域的繼承:子類可以繼承父類的所有成員。2、域的添加:在子類定義中加上新的域變量,就可以使得子類具有比父類多的屬性。如: class Student: Person string school; int score; 子類比父類多了兩個成員: school、score。3、域的隱藏:子類重新定義一個從父類中繼承的域變量。 class A public int a; class B:A new public int a;使用new修飾符來隱藏父類的同名成員a。53. 方法的繼承、添加與覆蓋1、方法的繼承:子類可以繼承父類的所有方法。2、方法的添加:在子類定義中加上新的方法,以針對

4、子類實現相應的功能。比如可以在Student類中定義分數的判斷方法。 3、方法的覆蓋:子類定義與父類同名的方法。(多態(tài)之一) (1)定義同名但參數列表不同的方法,稱為方法的重載; (2)定義同名且參數列表也相同的方法,稱為新增,這時應 該在同名方法前面用new修飾符; (3)定義同名且參數列表也相同的方法,并且父類中的方法用abstract/virtual進行修飾,子類中的方法用override進行了修飾,稱為虛方法的覆蓋。6方法重載舉例class parent public int add( int x,int y ) return(x+y); class child:parent publ

5、ic int add(int x,int y ,int z) return(x+y+z); public static void Main( ) child c1=new child( ); c1.add(1,2,3); c1.add(4,5); 分別使用了自己和父類的方法。7方法隱藏舉例class parent public int add( int x,int y ) return(x+y); class child:parent new public int add(int x,int y) return(x+y+10); public static void Main( ) child

6、 c1=new child( ); c1.add(4,5); 使用了自己的方法。8虛方法覆蓋舉例Class one public void x( ) Console.WriteLine(“one_x”); public virtual void y( ) Console.WriteLine(“one_y”); Class two:one new public void x( )/隱藏父類中的同名方法 Console.WriteLine(“two_x”); public override void y( )/重寫同名方法 Console.WriteLine(“two_y”);Class test

7、 public static void Main( ) two m2=new m2(); one m1=m2;/m1指向m2實例 m1.x(); m2.x(); m1.y( ); m2.y(); 結果:one_x two_x two_y two_y94.3.2 類的封裝 類的封裝改變了用戶傳統(tǒng)的使用數據和代碼的方式,它將方法和數據包含在一起構成一個獨立的單元,可以通過設定單元內各個成員的的特性來控制對成員的訪問。比如將一個字段定義為private,就可以防止外界直接訪問這個字段。封裝一個類由兩種做法:1)為一個私有類定義公共讀方法和寫方法;2)使用屬性,用set和get訪問器。10public

8、 class Student private string studentname; public string getstudentname( ) return(studentname);public string setstudentname(string na) studentname=na;class App public static void Main( ) Student s1=new Student( ); s1.setstudentname(“zhanghua”); Console.WriteLine(s1.getstudentname( ); 不能使用語句s1.studen

9、tname=“zhanghua”;114.3.3 多態(tài) 多態(tài)指的是定義具有不同功能但相同名稱的方法或屬性的多個類的能力。C#中的多態(tài)可以由虛方法實現。 對于非虛方法,其實現是不變的,無論由基類實例調用還是由派生類實例調用都是相同的;而虛方法的實現可以由派生類取代,取代的過程稱為重寫。重寫可以取代從基類繼承的虛方法,但原虛方法的可訪問性不能改變,靜態(tài)方法和非虛方法不能被重寫。基類 public virtual void Show( ) . 派生類 public override void Show( ) . 12 虛方法重寫舉例:定義基類圓形Round,有一個成員半徑,編寫構造函數和計算面積的虛

10、方法Area( );再定義一個派生類球形Sphere,對虛方法Area進行重寫。 class Round public double r; public Round(double r) this.r=r; public virtual double Area( ) return(3.14*r*r); class Sphere:Round public Sphere(double r):base(r) public override double Area( ) return(3.14*r*r*r); class App static void Main( ) Sphere s=new Sphe

11、re(2); Console.WriteLine(s.Area( ); 131. this關鍵字this關鍵字的作用是引用調用方法的當前實例,它可以從構造函數、實例方法和實例訪問器中訪問成員。用法一:使用this來訪問域和方法void sayHello( ) Console.WriteLine(“My name is”+name);與以下方法相同void sayHello( ) Console.WriteLine(“My name is”+);用法二:解決局部變量與域同名問題public Student(string name,string number)

12、=name; this.number=number;4.3.4 this和base關鍵字14this關鍵字舉例using System;public class Student public string name; public string number; public double subsidy=180; public Student(string name,string number) =name; this.number=number; public void ShowInfo( ) Console.WriteLine(“0n1”,name,number; Con

13、sole.WriteLine(“0”,AdvSubsidy.Caculate(this); public class AdvSubsidy public static double Caculate( student E) return(1.5*(E.subsidy); public class AppMain public static void Main( ) Student s1=new Student(“zhanghua”, “ 200454240”); s1.ShowInfo( ); 15this的注意事項this指的是調用的“對象”本身(1)通過this不僅可以引用該類中定義的域和

14、方法,還可以引用該類的父類中定義的域和方法;(2)在static靜態(tài)方法中,不能使用this關鍵字。162. base關鍵字:base指的是父類1) 明確指明父類的域和方法,例如,父類Person中有一個域為age,則在子類Student中用age 、 this.age 、 base.age來訪問age是完全一樣的。2) 當子類的方法隱藏或覆蓋了父類的同名方法但又要調用父類的方法時,使用base關鍵字。3) 想使用父類的構造方法。構造方法是不能繼承的,但子類可以在構造方法中調用直接父類的構造方法,如 Student(string name,int age,string school) :bas

15、e(name,age) this.school=school;17base(用法2)舉例using System;public class A public int a=10; public void m( ) a+; Console.WriteLine(a); class B:A new public int a=20; new public void m( ) a+; / base.m( ); Console.WriteLine(a); public static void Main( ) A x=new A( ); Console.WriteLine(x.a); /10 x.m( );

16、/11 B y=new B( ); Console.WriteLine(y.a); /20 y.m( ); /11 21 如此處直接使用base.m( );則最后的結果為12而不是21。184.4 運算符重載4.4.1 運算符重載基本概念4.4.2 單目運算符重載4.4.3 雙目運算符重載194.4.1 多態(tài)之二:運算符的重載運算符可以進行基本數據類型之間的運算,想把自己定義的類型進行類似“”之類的運算就要用到運算符重載對于、運算符完全可以提供對應的方法來完成,比如Decimal x,y;X+=y; 可以寫成 decimal.Add(x,y) x+=y;運算符重載的一般形式是 public s

17、tatic 返回類型 operator 運算符(參數表) 語句; 20using System;Class class1 public int x1,x2; public class1() x1=1; x2=2; public static int operator +(class1 c) c.x1=c.x1+10; c.x2=c.x2+5; Public void Show() Console.WriteLine(“0,1”,x1,x2);Class App public static void Main( ) class1 mc=new class1( ); mc.Show( ); mc+; mc.Show( ); 結果:x1=1,x2=2 x1=11,x2=74.4.2 單目運算符重載 +21using System;Class class1 public int x1,x2; public class1() x1=1; x2=2; public static class1 o

溫馨提示

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

評論

0/150

提交評論