第3章面向?qū)ο蠹夹g(shù)6_第1頁(yè)
第3章面向?qū)ο蠹夹g(shù)6_第2頁(yè)
第3章面向?qū)ο蠹夹g(shù)6_第3頁(yè)
第3章面向?qū)ο蠹夹g(shù)6_第4頁(yè)
第3章面向?qū)ο蠹夹g(shù)6_第5頁(yè)
已閱讀5頁(yè),還剩10頁(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、第5講繼承5.1 c#的繼承機(jī)制5.1.1概述兒個(gè)概念:基類,父類,派生類,子類,單繼承,多繼承。1、簡(jiǎn)單繼承例:using system;class vehicle 定義汽車類int wheels;公有成員輪子個(gè)數(shù)protected float weight; 保護(hù)成員重量 public vehicle();public vehicle (int w, fl oat g)wheels = w;weight = g;public void speak()console.writeline("the w vehicle is speaking!");;class car :v

2、ehicle 定義轎車類 從汽車類中繼承int wheels;公有成員輪子個(gè)數(shù)protected float weight;int passengers; 私有成員 乘客數(shù)public car(int w,float g,int p): base(w,g)wheels = w;weight = g;passengers = p;)public void speak()console.writeline(uthe w vehicle is speaking!'r);c#屮的繼承符合下列規(guī)則: 繼承是可傳遞的 如果cub中派生,b 乂從a中派生。那么c不僅繼承了 b屮聲明的成員,同樣也繼承

3、了 a屮的成員,object類作為所有類的基類。 派生類應(yīng)當(dāng)是對(duì)基類的擴(kuò)展 派生類可以添加新的成員,但不能除去已經(jīng)繼承的成員 的定義。 構(gòu)造函數(shù)和析構(gòu)函數(shù)不能被繼承除此以外的其它成員,不論對(duì)它們定義了怎樣的訪 問(wèn)方式,都能被繼承?;愔谐蓡T的訪問(wèn)方式只能決定派生類能否訪問(wèn)它們。 派牛類如杲定義了與繼承而來(lái)的成員同名的新成員,就可以覆蓋已繼承的成員。但 這并不因?yàn)檫@派生類刪除了這些成員,只是不能再訪問(wèn)這些成員。 類可以定義虛方法 虛屬性以及虛索引指示器它的派牛類能夠重載這些成員,從而 實(shí)現(xiàn)類可以展示出多態(tài)性。再看一個(gè)例子:using system;using system.text;class

4、personprivate string firstname;private string middlename;private string lastname;private int age;public person()public person(string fn, string in)firstname = fn;lastname = in;public person(string fn, string mn, string in)firstname = fn;middlename = mn;lastname = in;public person(string fn, string m

5、n, string in, int a)firstname = fn;middlename = mn;lastname = in;age = a;public void displayage()console.writelinec'age 0”, age);public void displayfullname()stringbuilder fullname = new stringbuilder();fullname.append(firstname);fullname.append(h");if( middlename != “”)fullname. append(mid

6、dlenameoj);fullname.append(".");1fullname. append(lastname);console. writeline(fullname);class nameapppublic static void main()person me = new person(,bradley, mleem, mjonesu);person my wife = new person(umelissa", "anne", "jones", 21);me.displayfullnameo;me.displa

7、yage();mywife.displayfullname();my wi fe.display age();)結(jié)果:bradly ljonesage 0melissa a.jonesage 21繼承using system;using system.text;class personprotected string firstname;protected string middlename; 不能訪問(wèn)基類中的私有成員 protected string lastname;private int age;/todo: add properties to access data memberspu

8、blic person()public person(string fn, string in)firstname = fn;lastname = in;public person(string fn, string mn, string in)firstname = fn;middlename = mn;lastname = in;public person(string fn, string mn, string in, int a)firstname = fn;middlename = mn;lastname = in;age = a;public void displayage()co

9、nsole.writeline(uage 0", age);public void displayfullname()stringbuilder fullname = new stringbuilder();fullname.append(firstname);fullname.append(" ”);if( middlename != m!,)fullname.append(middlenameo); fullname.append(". *');fullname.append(lastname);console. writeline(fullname)

10、;class employee : personprivate ushort hyear;public ushort hire yearget ( retum(hyear); set hyear = value; public employee(): base() 調(diào)用積累中的構(gòu)造方法public employee( string fn, string in ): base( fn, in)ipublic employee(string fn, string mn, string in, int a):base(fn, mn, in, a)public employee(string fn,

11、string in, ushort hy): base(fn, in)hi re year = hy;ipublic new void displayfullname() 這里是覆蓋console.writeline(hemployee: 0 1 2“,firstname, middlename, lastname);class nameapppublic static void main()person my wife = new person(nmelissa", "anne", "jones", 21);employee me = new

12、 employee("bradley", "l.h, "jones", 23);employee you = new employee("kyle", "rinni", 2000);mywife.displayfullname();my wife, display age();me.displayfullnameo;console.writeline("year hired: 0", me.hireyear);me.displayage();you.displayfullnameo;c

13、onsole. writeline(" year hired of him: 0", you. hi re year); you.displayage();)2、使用基類的方法public new void dsply()base.displayfullname();)實(shí)驗(yàn)一自己定義一個(gè)基類,派生一個(gè)子類,在子類中調(diào)用基類的成員方法;5.2多態(tài)性在面向?qū)ο蟮南到y(tǒng)中,多態(tài)性是一個(gè)非常重要的概念,它允許客戶對(duì)一個(gè)對(duì)象進(jìn)行操作。 由對(duì)象來(lái)完成一系列的動(dòng)作,具體實(shí)現(xiàn)哪個(gè)動(dòng)作,如何實(shí)現(xiàn)由系統(tǒng)負(fù)責(zé)解釋。5.2.1 c#中的多態(tài)性在c#屮多態(tài)性的立義是:同一操作作用于不同的類的實(shí)例,不同

14、的類將進(jìn)行不同的解 釋,最后產(chǎn)牛不同的執(zhí)行結(jié)果。c#支持兩種類型的多態(tài)性:編譯時(shí)的多態(tài)性編譯時(shí)的多態(tài)性是通過(guò)重載來(lái)實(shí)現(xiàn)的。運(yùn)行時(shí)的多態(tài)性運(yùn)行時(shí)的多態(tài)性就是指直到系統(tǒng)運(yùn)行時(shí),才根據(jù)實(shí)際情況決定實(shí)現(xiàn)何種操作,c#中,運(yùn)行時(shí)的多態(tài)性通過(guò)虛成員實(shí)現(xiàn)。例:using system;class person protected string firstname;protected string lastname;public person()public person(string fn, string in)firstname = fn;lastname = in;public void display

15、fullname()console.writeline("0 1", firstname, lastname);class employee : person public ushort hire year;public employee(): base()public employee( string fn, string in ): base( fn, in)public employee(string fn, string in, ushort hy): base(fn, in)hi re year = hy;public new void displayfullna

16、me()console.writeline(memployee: 0 1 ”,firstname, lastname);class nameapppublic static void main()employee me = new employee(hbradley, ”jones”,1983);person brad = me;me.displayfullname();console.writeline(hyear hired: 0m, me.hire year);brad.displayfullnameo;調(diào)用積累的方法實(shí)現(xiàn)i 調(diào)用各白所屬類的方法實(shí)驗(yàn)二測(cè)試brad.displayfull

17、name();7e否調(diào)用了積累的方法5.2.2虛方法當(dāng)類屮的方法聲明前加上了 virtual修飾符,我們稱之為虛方法,反之為非虛。使用了 virtual修飾符后不允許再有static, abstract,或override修飾符。對(duì)于非虛的方法,無(wú)論被其所在類的實(shí)例調(diào)用,還是被這個(gè)類的派牛類的實(shí)例調(diào)用。方 法的執(zhí)行方式不變,而對(duì)于虛方法,它的執(zhí)行方式可以被派生類改變,這種改變是通過(guò)方 法的垂載來(lái)實(shí)現(xiàn)的。using system;class apublic void f() console.writelinec'a.f");)public virtual void g() co

18、nsole.writeline("a.gh); class b: anew public void f() console.writeline(,b.fu); public override void g() console.writeline(,b.gh); )class teststatic void main()b b = new b();a a = b;a. f();b. f();a. g();b. g(); 測(cè)試?yán)又衋類提供了兩個(gè)方法,非虛的f和虛方法g。類b則提供了一個(gè)新的非 虛的方法f從而覆蓋了繼承的f,類b同時(shí)還重載了繼承的方法g那么輸出應(yīng)該是a. fb. fb.g

19、b.g實(shí)驗(yàn)三試寫出程序的運(yùn)行結(jié)果 using system;class personprotected string firstname;protected string lastname;public person()public person(string fn, string in)firstname = fn;lastname = in;public virtual void displayfullname()console.writeline("0 1", firstname, lastname);)class employee : personpublic us

20、hort hire year;public employee(): base()public employee(string fn, string in, ushort hy): base(fn, in)hire year = hy;public override void displayfullname()console.writeline(uemployee: 0 1firstname, lastname);/ a new class derived from personclass contractor : personpublic string company;public contr

21、actor(): base()public contractor(string fn, string in, string c): base(fn, in)company = c;public override void displayfullname()console.writeline(hcontractor: (0) 1 n, firstname, lastname);class nameapppublic static void main()person brad = new person(,bradley, "jones");person me = new emp

22、loyee(mbradleym, 'jones, 1983);person greg = new contractor(mhiir "batfield", "data diggers11);brad.displayfullname();me.displayfullnameo; greg.displayfullname();)5.2.3在派生類中對(duì)虛方法進(jìn)行重載重載對(duì)基類虛方法的重載是*1數(shù)重載的另一種特殊形式,在派生類中重新定義此虛兩數(shù)時(shí) 要求的是方法名稱,返冋值類型,參數(shù)表中的參數(shù)個(gè)數(shù)、類型、順序都必須與基類中的 虛函數(shù)完全一致,在派牛類中聲明對(duì)虛方法的

23、重載,要求在聲明中加上override關(guān)鍵字 而 且不能有new, static或virtual修飾符。using system;class vehicle/定義汽車類public int wheels; 公有成員 輪子個(gè)數(shù)protected float weight; 保護(hù)成員 重量public vehicle(int w,float g)wheels = w;weight = g;public virtual void speak()console.writelinec'the w vehicle is speaking!");class car: vehicle 定義轎

24、車類int passengers; /私有成員 乘客數(shù)public car(int w,float gjnt p): base(w.g)wheels = w;weight = g;passengers = p;public override void speak()console.writeline(uthe car is speaking:di-di!);)class truck: vehicle 定義卡車類int passengers; /私有成員 乘客數(shù) loat load; 私有成員載重量public truck (int w,float gjnt p float 1): base(w

25、,g)wheels = w;weight = g;passengers = p;console.writelinec'the truck is speaking:ba-ba!m);class testpublic static void main()vehicle vl = new vehicle();car cl = new car(4,2,5);truck tl = new twck(6,5,3,10);vl.speak();vl = cl;vl.speak();ci.speak();vl = tl;vl.speak();tl.speak();the vehicle is spea

26、king!the car is speaking:di-di!the car is speaking:di-di!the truck is speaking:ba-ba!the truck is speaking:ba-ba!5.3抽彖與密封5.3.1抽象類抽象類使用abstract修飾符對(duì)抽彖類的使用有以下兒點(diǎn)規(guī)定:抽象類只能作為其它類的基類,它不能直接被實(shí)例化,而且對(duì)抽象類不能使用new操 作符,抽象類如果含有抽象的變屋或值,則它們耍么是null類型,耍么包含了對(duì)非抽 象類的實(shí)例的引用。抽象類允許包含抽象成員。抽象類不能同時(shí)乂是密封的。如果一個(gè)非抽象類從抽彖類中派牛.,則其必須通過(guò)重載來(lái)實(shí)

27、現(xiàn)所有繼承而來(lái)的抽象成 員。abstract class apublic abstract void f();abstract class b: apublic abstract void f();public void g() )class c: bpublic override void f() /f的具體實(shí)現(xiàn)代碼實(shí)例using system;abstract class vehicle 定義汽車類public int wheels; /公有成員 倫子個(gè)數(shù) protected float weight; 保護(hù)成員 垂量 public vehicle(int w,float g)wheels

28、 = w;weight = g;public virtual void speak()console.writeline(uthe w vehicle is speaking!?,);)1;class car: vehicle 定義轎車類int passengers;/私有成員 乘客數(shù)public car(int w,float g,inl p): base(w,g)wheels = w;weight = g;passengers = p;)public override void speak()console.writeline(<4the car is speaking:di-di!

29、);)class truck: vehicle 定義卡不類int passengers; /私有成員 乘客數(shù)float load; /私冇成員 載重量public truck (int w, fl oat g,int p float 1): base(w,g)wheels = w;weight = g;ssengers = p;load = 1;public override void speak()console.writeline(<4the truck is speaking:ba-ba!);)?抽象方法可否覆蓋,請(qǐng)創(chuàng)建基類和子類驗(yàn)證之。作業(yè)5.3.2抽象方法一個(gè)方法聲明中如果加上

30、abstract修飾符,我們稱該方法為抽象方法abstract method如果一個(gè)方法被聲明也是抽象的,那么該方法默認(rèn)也是一個(gè)虛方法,事實(shí)上抽象方法是一個(gè)新的虛方法。它不提供具體的方法實(shí)現(xiàn)代碼,我們知道非虛的派生類要求通過(guò)重載為繼承的虛方法提供自己的實(shí)現(xiàn),而抽象方法則不包含具體的實(shí)現(xiàn)內(nèi)容所以方法聲明的執(zhí)行體中只有一個(gè)分號(hào)。只能在抽象類中聲明抽象方法,對(duì)抽象方法不能再使用static或virtual修飾符。 而且方法不能有任何可執(zhí)行代碼,哪怕只是一對(duì)大括號(hào)中間加一個(gè)分號(hào);都不允許出現(xiàn)只需要給出方法的原型就可以了。using system;abstract class vehicle 定義汽車類

31、public int wheels; /公有成員 輪子個(gè)數(shù) protected float weight; /保護(hù)成員 重量 public vehicle(int wfloat g)wheels = vv;weight = g;public abstract void speak();class car:vehicle 定義轎車類int passengers;/私有成員 乘客數(shù) public car(int w,float gjnt p): base(w,g) wheels = vv;weight = g;passengers = p;public override void speakqconsole.writeline(uthe ca

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論