故事派分析C#,逆變協(xié)變之協(xié)變

知識儲備:泛型接口,里氏轉(zhuǎn)換







? ? ?微軟MSDN總是不說人話,中國翻譯的編程指導(dǎo)書也都是故作高深,你看著這些名詞的翻譯:逆變,協(xié)變,不變,都神馬玩意。筆者也是奔走在學(xué)習(xí)編程康莊大道上的小爬蟲程序員,最看不慣中國技術(shù)文獻(xiàn)中間不裝逼會死的屬性,雖然自己學(xué)藝不精,但是斗膽寫這篇自己對C#知識點(diǎn)的理解,大神路過莫要笑話。如果文中理解有誤,也請各位不吝指正。









? ? ? ?首先要知道什么是里氏轉(zhuǎn)換:簡而言之,老爹能干的活,換兒子上陣一樣不出岔子。子類可以替換掉父類,而程序運(yùn)行不出問題。這點(diǎn)也不難理解,畢竟兒子繼承了老爹的全部本事,還發(fā)揚(yáng)光大了,替父出力只是發(fā)揮了基本功而已。









? ? ? ?然后是接口:接口可以理解成為一種最低標(biāo)準(zhǔn)。比如一篇從初中就總要學(xué)習(xí)寫的議論文,老師就教我們一篇文章要有論點(diǎn),論據(jù)和論證,同時(shí)抓住時(shí)事要點(diǎn)。一篇文章一旦在文中把這三點(diǎn),針對時(shí)事材料詳加闡釋,雖然它不一定是一篇好的議論文,但是也具有議論文大體的樣子了。泛型接口就是對接口規(guī)則的進(jìn)一步擴(kuò)大化,接著上面的例子可以簡單理解為:我們實(shí)現(xiàn)了接口“寫議論文技能”,于是我們會抓住論點(diǎn)論據(jù)論證一通胡侃;然而在初中之前,就有個(gè)小學(xué)語文老師傳授給我們了一個(gè)泛型接口:“寫文章技能”,這個(gè)接口里我們學(xué)習(xí)到寫文章要分自然段,要有標(biāo)點(diǎn)符號,要有開頭,內(nèi)容和結(jié)尾總結(jié)。









好,知識背景到這里,開始正題。









? ? ? ?時(shí)事評論員老爹有個(gè)時(shí)事評論員兒子,兩人都對社會現(xiàn)象有著犀利的認(rèn)識,然而兩人文風(fēng)迥然不同,老爹喜歡根據(jù)書本理論推演出一套結(jié)論,凡事總引經(jīng)據(jù)典,講個(gè)言出有據(jù)。兒子喜歡站在人的角度,分析人和人的異同,得出的結(jié)論很接地氣,話糙理不糙。兒子雖說是老爹的兒子,但是兩人終究不是一個(gè)流派的,師承不同,所以各過各的,不耽誤兒子孝敬老爹,但也不打過問各自的事業(yè)。




? ? ? ?有一天社會出現(xiàn)了某富家子瘋狂駕車撞死了路邊大學(xué)生還瘋狂叫囂的時(shí)間,于是報(bào)社向評論員父子分別約稿,要兩位分析一下這個(gè)事件。于是父子倆分別開始用各自熟悉的角度開始撰文。兒子手快,洋洋灑灑千字文章寫就,老爹卻哀嘆人心不古,急火攻心急出病來,住進(jìn)了醫(yī)院。文章還要交付,于是報(bào)社向兒子求助:你是你爹的兒子,他的文章你來替他寫完咋樣?兒子斷然拒絕:我是他兒子不假,只是老爹那派引經(jīng)據(jù)典寫法我做不來啊。









? ? ? ?這就是協(xié)變的前提:雖然老爹和兒子做的事情差不離,兒子在很多地方上出面確實(shí)也能代替老爹(根據(jù)里氏轉(zhuǎn)換),但是這件事還真心不行,因?yàn)槔系鶎?shí)現(xiàn)的是“引經(jīng)據(jù)典評時(shí)事”接口,而兒子實(shí)現(xiàn)的是“嬉笑怒罵評時(shí)事”接口,讓兒子露臉代替老爹領(lǐng)個(gè)獎(jiǎng)容易,讓兒子捉刀替老爹寫文章就有點(diǎn)勉為其難了。一句話:繼承的了血緣,有些本事還真遺傳不來??此苾鹤邮抢系},但是兩人的筆墨功夫都是兩人各自從各自老師那里學(xué)來的,沒遺傳到?。?br>








? ? ? ?報(bào)社不這么認(rèn)為,對這個(gè)兒子說:你是你老爹的兒子,耳濡目染幾十年,沒研究過總歸也看過嘛。給你一個(gè)錦囊,你回家拆開看過,一定會懂你老爹的思路,然后替我們吧這篇文章寫完。兒子回家拆開一看,錦囊上書三個(gè)大字“O-U-T”,頓時(shí)觸電一般,明白報(bào)社同意其也加入了自己的寫作特點(diǎn),于是順利替老爹寫完了文章。









? ? ? ?文中老爹自然是父類,兒子是派生類,老爹的議論文是接受了父類的議論文泛型接口,具備議論文的文體和老爹的風(fēng)格,兒子的議論文是接受了派生類的議論文泛型接口,具備議論文的文體和兒子的風(fēng)格。報(bào)社就是我們這些編程者,兒子是老爹的兒子,寫篇文章咋就不行?不是里氏轉(zhuǎn)換說好的老爹能干的事情換兒子就沒問題嗎?不過這事真不怪里氏轉(zhuǎn)換,里氏轉(zhuǎn)換說派生類替代父類沒問題,但是寫文章這事可不是老爹遺傳給兒子的,而是各自從老師那里學(xué)來的(實(shí)現(xiàn)了議論文接口),所以兒子也就不能代替老爹了。然而我們作為報(bào)社自然有掌控的權(quán)利,加一個(gè)out關(guān)鍵字,意思就是老爹的文章還是老爹署名,但是卻可以加入兒子的文風(fēng),于是乎文章就在這種寬松的要求下寫成了。









? ? ? ?out就是協(xié)變的關(guān)鍵字,指的就是編譯器放棄了對接口嚴(yán)格的的類型匹配,允許帶有派生關(guān)系的類型參數(shù)對接口產(chǎn)生影響,從而產(chǎn)生接口本身類似所帶參數(shù)的繼承特性。這其實(shí)犧牲了編譯器自身的嚴(yán)謹(jǐn)性,然而很符合程序員所理解的里氏轉(zhuǎn)換表面特點(diǎn),所以協(xié)變有了其存在價(jià)值。









最后,鄙視一下不接地氣的各種編程書!需要結(jié)合代碼理解的請自己查找MSDN或者若干協(xié)變事例,謝謝各位啦。歡迎各路高手一起來探討,林楠愿向各位學(xué)習(xí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容