欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
c#基礎五 面向對象高級編程(封裝 繼承 多態(tài) 抽象類(lèi) 密封類(lèi) 接口)

1.類(lèi)的繼承與多態(tài)性

1.1基類(lèi)和擴充類(lèi)

       C#實(shí)現繼承的方式:類(lèi)繼承和接口繼承

       繼承用冒號(:)表示。被繼承的叫做父類(lèi)或者基類(lèi),從基類(lèi)繼承的類(lèi)叫擴充類(lèi),又叫派生類(lèi)或子類(lèi)。所有類(lèi)的基類(lèi)System.Object

聲明方式:[訪(fǎng)問(wèn)修飾符] class 擴充類(lèi)名稱(chēng):基類(lèi)名稱(chēng)

     {    

     }

  若B繼承自A,也可以使用強制轉換操作將其轉換為A 對象。如:

  A b = (A)new B();或者 A b = new B();此時(shí),B對象將被限制為A 對象的數據和行為,而無(wú)法再訪(fǎng)問(wèn)B對象中的數據和行為,除非A中的方法被B重載,將會(huì )訪(fǎng)問(wèn)B 的方法。將B強制轉換為A后,還可以將A重新轉換為B,但是,并非A的所有實(shí)例在任何情況下都可強制轉換為B,只有實(shí)際上是B的實(shí)例的那些實(shí)例才可以強制轉換為B。

       擴充類(lèi)不能繼承基類(lèi)中定義的private方法,只能繼承基類(lèi)的public成員或者protected成員。

       初始化基類(lèi)時(shí),會(huì )首先調用基類(lèi)的構造函數再調用擴充類(lèi)的構造函數

1.2 多態(tài)性

       定義:同一操作作用于不同類(lèi)的實(shí)例,不同的類(lèi)將進(jìn)行不同的解釋?zhuān)詈螽a(chǎn)生不同的結果。即:建立一個(gè)父類(lèi)的對象,它的內容可以是這個(gè)父類(lèi)的,也可以是這個(gè)子類(lèi)的,子類(lèi)和父類(lèi)都定義有同樣的方法;當使用對象調用這個(gè)方法的時(shí)候,父類(lèi)里的同名對象將被調用,當在父類(lèi)的這個(gè)方法前加virtual關(guān)鍵字,子類(lèi)的同名方法將被調用。

       實(shí)現多態(tài)的方法:

              1.通過(guò)繼承實(shí)現。多個(gè)類(lèi)可以繼承自同一個(gè)類(lèi),每個(gè)擴充類(lèi)可根據重寫(xiě)基類(lèi)成員以提供不同的功能。

              2.通過(guò)抽象類(lèi)實(shí)現。抽象類(lèi)本身不能被實(shí)例化,只能在擴充類(lèi)中通過(guò)繼承使用。抽象類(lèi)的部分或全部成員不一定都要實(shí)現,但要在繼承類(lèi)中全部實(shí)現,抽象類(lèi)中已實(shí)現的成員扔可以被重寫(xiě),并且繼承類(lèi)仍可以實(shí)現其他功能。

              3.通過(guò)接口實(shí)現。接口僅聲明類(lèi)需要實(shí)現的方法、屬性、事件;以及每個(gè)成員需要接受和返回的參數類(lèi)型,而他們的特定實(shí)現需要實(shí)現類(lèi)去完成。

  • 虛擬(virtual)和重寫(xiě)(override)

C#中,如果基類(lèi)的某個(gè)功能不滿(mǎn)足要求,可以在擴充類(lèi)中重寫(xiě)基類(lèi)的方法實(shí)現新的功能,

 1 class A
2
3 {
4
5 public virtual string MyProperty { get; set; }//擴充類(lèi)可以重寫(xiě)此屬性
6
7 static void Main(string[] args)
8
9 {
10
11 }
12
13 public virtual void myMethod()//擴充類(lèi)可以重寫(xiě)此方法
14
15 {
16
17 }
18
19 }
20
21 class B : A
22
23 {
24
25 public override void myMethod()//基類(lèi)中也可以不重寫(xiě)此方法
26
27 {
28
29 }
30
31 }

注意:(1)虛擬方法不能聲明 為靜態(tài)的。因為靜態(tài)的方法是應用在類(lèi)一層次的,而面向對象的多態(tài)性只能在對象上運作,所以無(wú)法在類(lèi)中使用。此外,override,abstract也不能跟static共存.

       (2)virtual 不能喝private 一起使用,否則無(wú)法在擴充類(lèi)中重寫(xiě)。

       (3)重寫(xiě)方法的名稱(chēng)、參數個(gè)數、類(lèi)型以及返回值都必須和虛擬方法一致。

  • 隱藏

只有在擴充類(lèi)中使用override修飾符時(shí),才能重寫(xiě)基類(lèi)聲明為virtual的方法;否則,在繼承的類(lèi)中聲明一個(gè)與基類(lèi)方法同名的方法會(huì )隱藏基類(lèi)的方法。

與方法或屬性不同的是,使用new關(guān)鍵字時(shí)并不要求基類(lèi)中的方法或屬性聲明為virtual,只要在擴充類(lèi)的方法或屬性前聲明為new,就可以隱藏基類(lèi)的方法或屬性。理解:新方法把老方法(相對于子類(lèi))隱藏,但老方法仍可見(jiàn)。

舉例:

父:實(shí)例:b,

子:實(shí)例 d;

(1)父方法:無(wú)virtual;子方法:new;此時(shí)若強制轉換b=d,b.方法 調用父中方法

(2)父方法:有virtual;子方法:new;此時(shí)若強制轉換b=d,b.方法 調用父中方法

(3)父方法:有virtual;子方法:override;此時(shí)若強制轉換b=d,b.方法 調用子類(lèi)中方法

什么時(shí)候用隱藏呢?

       如開(kāi)發(fā)人員A需要重新設計基類(lèi)中的某個(gè)方法,該基類(lèi)是一年前由另一組開(kāi)發(fā)人員設計的,并且已經(jīng)交給用戶(hù)使用,可是原來(lái)的開(kāi)發(fā)人員在方法前沒(méi)有加virtual關(guān)鍵字,但又不允許修改原來(lái)的程序,這是無(wú)法用override重寫(xiě)基類(lèi)的方法,這是就需要隱藏基類(lèi)的方法。

  • 在擴充類(lèi)中直接調用基類(lèi)的方法

可以在擴充類(lèi)中用關(guān)鍵字base直接調用基類(lèi)的方法。

 1 class B
2
3 {
4
5 public virtual int myMethod()
6
7 {
8
9 return 5;
10
11 }
12
13 }
14
15 class C : B
16
17 {
18
19 public override int myMethod()
20
21 {
22
23 return base.myMethod()*4;
24
25 }
26
27 }

1.3抽象類(lèi)

       使用abstract修飾符,若類(lèi)中的方法或屬性為abstract,類(lèi)必須用abstract修飾。只能用作基類(lèi),抽象方法沒(méi)有實(shí)現代碼(無(wú)大括號?。?/strong>

抽象類(lèi)和非抽象類(lèi)的區別:

(1)抽象類(lèi)不能直接被實(shí)例化,只能在擴充類(lèi)中通過(guò)繼承使用

(2)抽象類(lèi)可以包含抽象成員,非抽象類(lèi)不能包含抽象成員

當從抽象類(lèi)派生非抽象類(lèi)時(shí),非抽象類(lèi)必須實(shí)現抽象類(lèi)的所有(必須是所有?。?/strong>抽象成員,當然,如果繼承抽象類(lèi)的也是抽象類(lèi)就不必實(shí)現其抽象成員,由最后一個(gè)非抽象類(lèi)實(shí)現。

 1   abstract class B
3 {
5 public abstract int BMethod();
6
7 }
8
9 abstract class C : B
10
11 {
13 public int CMethod()
14
15 {
16
17 return 4;
18
19 }
20
21 }
22
23 class D : B
24
25 {
27 public override int BMethod()
28
29 {
30
31 return 1;
32
33 }
34
35 }

什么時(shí)候使用抽象類(lèi)呢?

如果有一個(gè)通用方法,對所有擴充類(lèi)來(lái)說(shuō)都是公共的,并且強制要求所有擴充類(lèi)都必須實(shí)現這個(gè)方法,這種情況下就可以把該方法定義為基類(lèi)中的抽象方法。

1.4 密封類(lèi)

密封類(lèi)是不能被其他類(lèi)繼承的類(lèi),用sealed關(guān)鍵字聲明。sealed關(guān)鍵字也可以限制基類(lèi)中的方法,防止被擴充類(lèi)重寫(xiě),若類(lèi)中的方法是sealed,該類(lèi)不是必須用sealed來(lái)修飾的。帶有sealed修飾符的方法稱(chēng)為密封方法,sealed方法必須和override關(guān)鍵字一起使用。

一般情況下,只有在某個(gè)方法重寫(xiě)了基類(lèi)中同名的方法,但又不希望該方法所在的類(lèi)的擴充類(lèi)重寫(xiě)該方法,就可以在該方法前使用修飾符sealed。

 1 abstract class B
2
3 {
4
5 public abstract int BMethod();
6
7 }
8
9 class D : B
10
11 {
12
13 public override sealed int BMethod()//BMethod方法將不能再被重寫(xiě)
14
15 {
16
17 return 1;
18
19 }
20
21 }

1.5 繼承過(guò)程中構造函數的處理

在擴充類(lèi)中,繼承了所有基類(lèi)中聲明的public或protected成員。但是構造函數則排除在外,不會(huì )被繼承下來(lái)。

為什么不繼承基類(lèi)的構造函數呢?因為構造函數的主要用途是對類(lèi)的成員初始化,包括對私有成員的初始化。如果讓構造函數也能繼承,由于擴充類(lèi)中無(wú)法訪(fǎng)問(wèn)基類(lèi)的私有成員,因此會(huì )導致創(chuàng )建擴充類(lèi)的實(shí)例時(shí)無(wú)法對基類(lèi)的私有成員進(jìn)行初始化工作,從而導致程序運行失敗。為了解決這個(gè)問(wèn)題,c#在內部按照下列順序處理構造函數:從擴充類(lèi)依次向上尋找基類(lèi),直到找到最初的基類(lèi),然后開(kāi)始執行最初的基類(lèi)的構造函數、再依次向下執行擴充類(lèi)的構造函數,直至執行完最終的擴充類(lèi)的構造函數為止。

如下代碼會(huì )發(fā)生“A方法沒(méi)有0個(gè)參數的重載”錯誤,這是因為創(chuàng )建B的實(shí)例時(shí),編譯器會(huì )尋找基類(lèi)A中提供的無(wú)參數的構造函數,而A中沒(méi)有,從而報錯。

 1 class Program
2
3 {
4
5 static void Main(string[] args)
6
7 {
8
9 B b = new B(10);
10
11 Console.ReadLine();
12
13 }
14
15 }
16
17 class A
18
19 {
20
21 private int age;
22
23 public A(int age1)
24
25 {
26
27 this.age = age1;
28
29 }
30
31 }
32
33 class B : A
34
35 {
36
37 private int age;
38
39 public B(int age1)
40
41 {
42
43 this.age = age1;
44
45 }
46
47 }

       要解決這個(gè)問(wèn)題,需將public B(int age1)改為public B(int age1):base(age1)即可。程序執行時(shí),會(huì )先調用System.Object的構造函數,然后調用A的帶參數的構造函數,由于B的構造函數已經(jīng)將age1參數傳遞給A,所以A的構造函數就可以利用這個(gè)傳遞的參數進(jìn)行初始化。

2.版本控制

所有的方法默認都是非虛擬的,調用非虛擬方法時(shí)不會(huì )受到版本的影響。若基類(lèi)中聲明一個(gè)虛擬方法,而擴充類(lèi)的方法中使用了override關(guān)鍵字,則執行時(shí)會(huì )調用擴充類(lèi)中的方法;若沒(méi)有使用override關(guān)鍵字,則調用基類(lèi)的方法。而沒(méi)有聲明為virtual的非虛擬方法,則在編譯時(shí)就確定了應該調用哪個(gè)方法了。

View Code

另外,若B繼承自A,C繼承自B,那么A中的virtual方法,B中override后,C中還可以繼續override。即 被override修飾的方法后就默認為virtual,即virtual具有傳遞性。

3.接口

接口像一個(gè)抽象類(lèi),不過(guò),接口是完全抽象的集合成員,主要特點(diǎn)是 只有聲明部分,沒(méi)有實(shí)現部分。一般用I開(kāi)頭,接口中只能包含:(1)方法 屬性 索引器和事件的聲明,(2)不能包含構造函數(因為無(wú)法構建不能實(shí)例化的對象)(3)不能包含字段(因為字段隱含了某系內部的執行方法)(4)不能包含任何實(shí)現代碼(5)接口中的方法必須都是public的,因此不能再用public修飾符聲明。

       接口的用途是表示設計者和調用者的一種約定。例如,提供某個(gè)方法用什么名字、需要哪些參數、以及每個(gè)參數的類(lèi)型。抽象類(lèi)和接口的一個(gè)主要差別:類(lèi)可以繼承多個(gè)接口,但只能繼承一個(gè)抽象類(lèi)。

       使用接口還是抽象類(lèi)來(lái)為組件提供多態(tài)性主要考慮以下幾個(gè)方面:

       (1)如果預計要創(chuàng )建組件的多個(gè)版本,則創(chuàng )建抽象類(lèi)。抽象類(lèi)提供簡(jiǎn)單易行的方法來(lái)控制組件版本。通過(guò)更新基類(lèi),是所有繼承類(lèi)都自動(dòng)更新。另一方面,為了保護為使用接口而編寫(xiě)的現有系統,要求接口一旦創(chuàng )建就不能更改。如果需要接口的新版本,必須創(chuàng )建一個(gè)新的接口

       (2)如果創(chuàng )建的功能將在大范圍的完全不同的對象間使用,則使用接口。抽象類(lèi)應主要用于關(guān)系密切的對象,而接口最適合為不相關(guān)的類(lèi)提供通用功能。

       (3)如果要設計小而精煉的功能塊,則使用接口;如果要設計大的功能單元,則使用抽象類(lèi),設計優(yōu)良的接口往往很小且相互獨立,減少了發(fā)生性能問(wèn)題的可能。

       (4)如果要在組件的所有實(shí)現間提供通用的已實(shí)現的功能,則使用抽象類(lèi),抽象類(lèi)允許部分實(shí)現類(lèi),而接口不包含任何成員的實(shí)現。

接口的聲明與實(shí)現:

聲明:

[訪(fǎng)問(wèn)修飾符] interface 接口名稱(chēng)

{

//接口體

}

實(shí)現某個(gè)接口的任何類(lèi)都將擁有該接口中所有元素,因此,當需要再不相關(guān)的類(lèi)中實(shí)現同樣的功能時(shí),就可以使用接口。

View Code

顯示方式實(shí)現接口:

由于不同接口中的方法可以重名,因此,在一個(gè)類(lèi)中實(shí)現接口中的方法時(shí)就存在著(zhù)多義性,這時(shí)可以顯示實(shí)現接口中的方法,對于顯示實(shí)現的方法,不能通過(guò)類(lèi)的實(shí)例訪(fǎng)問(wèn),而必須使用接口的實(shí)例。

View Code

小總結

封裝優(yōu)點(diǎn):

  1. 良好的封裝能夠減少耦合
  2. 類(lèi)內部的實(shí)現可以自由的修改
  3. 類(lèi)具有清晰的對外接口

繼承優(yōu)點(diǎn):

1.使得所有子類(lèi)公共的部分都放在了父類(lèi),使得代碼得到了共享,就避免了重復

2.繼承可使得修改或擴展繼承而來(lái)的實(shí)現代碼都較為容易。

缺點(diǎn):

父類(lèi)變,子類(lèi)不得不變,繼承會(huì )破壞包裝,父類(lèi)實(shí)現細節暴露給子類(lèi),其實(shí)是增大了兩個(gè)類(lèi)之間的耦合性。

注意:c#中,子類(lèi)從它的父類(lèi)中繼承的成員有方法,域,屬性,事件,索引指示器,但構造方法只能被調用不能繼承??梢杂胋ase關(guān)鍵字調用父類(lèi)的成員。當兩個(gè)類(lèi)之間具備“is-a”關(guān)系時(shí),就可以考慮用繼承。

 

多態(tài)特點(diǎn):

1.子類(lèi)以父類(lèi)的身份出現

2.子類(lèi)在工作時(shí)以自己的方式來(lái)實(shí)現

3.子類(lèi)以父類(lèi)身份出現時(shí),子類(lèi)特有的屬性和方法不可以使用

要實(shí)現多態(tài),要將父類(lèi)聲明為虛方法,子類(lèi)將方法重寫(xiě):override

注意:

重載:一般在類(lèi)內部,在不改變原方法的基礎上,增加新功能;兩個(gè)方法必須要方法名相同,但參數類(lèi)型或個(gè)數必須要有所不同。

重寫(xiě):一般在不同的類(lèi)中,必須要跟重寫(xiě)的方法返回類(lèi)型及參數個(gè)數及類(lèi)型都相同,需要加override關(guān)鍵字,被重寫(xiě)的方法要加      virtual關(guān)鍵字。

 

 

抽象類(lèi)和接口的區別:

表面上看:1.抽象類(lèi)可以給出一些成員的實(shí)現,而接口不包含任何成員的實(shí)現

         2.抽象類(lèi)的抽象成員可被子類(lèi)部分實(shí)現,而接口的成員需要實(shí)現類(lèi)完全實(shí)現

         3.一個(gè)類(lèi)只能繼承一個(gè)抽象類(lèi),但可實(shí)現多個(gè)接口

深層次:  1 .類(lèi)是對對象的抽象,抽象類(lèi)是對類(lèi)的抽象(類(lèi)相關(guān)性),接口是對行為的抽象(行為相關(guān)性)

         2.對于行為跨越不同類(lèi)的對象,可使用接口;對于一些相似的類(lèi)對象,用繼承抽象類(lèi)

         3.從設計角度講,抽象類(lèi)是從子類(lèi)中發(fā)現了公共的東西,泛化出父類(lèi),然后子類(lèi)繼承父類(lèi);而接口是根本不知子類(lèi)的存在,方法如何實(shí)現還不確定,預先定義。

抽象類(lèi)往往是通過(guò) 重構 得來(lái)的,是自底而上抽象出來(lái)的,而接口則是自頂向下設計出來(lái)的。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
生活服務(wù)
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久