2 回答

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
接口多態(tài)性,繼承多態(tài)性和抽象類多態(tài)性。
接口多態(tài)性:簡單的說,很多類可以實(shí)現(xiàn)同樣的接口,而一個(gè)類也可以實(shí)現(xiàn)很多個(gè)接口。
繼承多態(tài)性:繼承多態(tài)性是最常見的形式。通過virtual關(guān)鍵字的使用,繼承多態(tài)性提供了方法的不同實(shí)現(xiàn)。
在繼承一個(gè)類時(shí),會繼承該類的所有方法,屬性,事件以及特性。另外還會繼承所有這些成員
的實(shí)現(xiàn)。但有時(shí)候并不想繼承某個(gè)或某些功能,或者需要稍作變化。現(xiàn)在只要在基類中把方法
或?qū)傩詷?biāo)記為virtual,就可以在子類中重寫功能。
抽象類多態(tài)性:抽象類是指用abstract類型修飾符標(biāo)記的類。抽象類通常具有抽象方法,抽象方法是指定
義了但是沒有實(shí)現(xiàn)的方法,這種方法不能被實(shí)例化。用抽象類來實(shí)現(xiàn)多態(tài)性有點(diǎn)類似于繼承
多態(tài)性。區(qū)別在于,方法標(biāo)記是abstract,而不是virtual。抽象方法不提供實(shí)現(xiàn),因此是完全依
靠子類來實(shí)現(xiàn)功能的。抽象方法也比較像接口中定義的方法,因?yàn)檫@種方法提供一個(gè)協(xié)議聲
明,表示該方法會在子類中實(shí)現(xiàn)。
將方法標(biāo)記為virtual:
當(dāng)方法用關(guān)鍵字virtual修飾時(shí),表明子類可以重寫該方法的實(shí)現(xiàn)。這是所有面向?qū)ο笳Z言的根
本。定義一個(gè)虛方法后,表明希望在子類中重寫該方法。如果并不想重寫方法,就不要將方法聲
明為虛擬的,這樣會導(dǎo)致額外的系統(tǒng)開銷。
這種額外系統(tǒng)開銷的來源,是因?yàn)橐獮橹貙懛椒z查對象的運(yùn)行時(shí)類型。然后調(diào)用派生程度最
大的類中的重寫方法。如果這個(gè)類為基類,哪么就調(diào)用該基類中的虛方法,因此,所有在檢查
類型并查找重寫方法時(shí)耗去的資源都浪費(fèi)了。
由于派生類中的方法重寫了基類中的方法,因此在聲明派生類方法時(shí),使用的標(biāo)記應(yīng)該與將要
重寫的虛方法相同。

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
多態(tài)又稱后期綁定,是一種在運(yùn)行時(shí)(just in time)指定方法調(diào)用地址的技術(shù)。
通常,編譯器在編譯期就能知道方法的地址,運(yùn)行時(shí)直接加載這個(gè)地址上的堆棧代碼(.net中指中間代碼)就可以了,這被稱為靜態(tài)綁定或前期綁定,雖然很少使用這個(gè)術(shù)語。
編譯器在編譯期不能確定方法的地址,而只能在運(yùn)行時(shí)確定的就被稱為后期綁定(或動態(tài)聯(lián)編)。例如,對于object類的ToString方法,其方法定義是返回類的名稱,但是,調(diào)用這個(gè)方法卻不一定能夠返回類的名稱(如String類),因?yàn)樗锌赡鼙慌缮愔貙懀鄳B(tài)技術(shù)確保運(yùn)行時(shí)能夠調(diào)用到正確的方法。
- 2 回答
- 0 關(guān)注
- 649 瀏覽
添加回答
舉報(bào)