最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C++編程知識解析:如何理解面向?qū)ο笾校瑢ο笈c對象的關系?

2021-08-19 18:49 作者:C語言編程__Plus  | 我要投稿

在我上學的時候,一聊到設計模式都是很有格調(diào)的話題,仿佛設計模式就是解決軟件開發(fā)的精髓,但是很長一段時間,我從骨子里是排斥設計模式的,因為我覺得自己連面向?qū)ο蟮闹R都沒有領悟,談論設計模式還為時尚早,我尤其排斥那本被吹到爆炸的《大話設計模式》,那本設計模式看上去給你用形象的比喻講明白了一個東西,但實際上你真正開始寫代碼的時候,發(fā)現(xiàn)自己什么都寫不出來。


這篇博客是想退一步思考,總結(jié)一些面向?qū)ο蟮闹R,比如思考“對象與對象的關系”到底是怎樣的。

和大部分人一樣,初學面向?qū)ο蟮臅r候,都會鋪天蓋地的聽到一些詞匯,比如“面向?qū)ο蟮娜筇匦允抢^承,封裝,多態(tài)?!保俦热缫磺卸际菍ο?。但如果你僅僅記住這幾句話,真的很難領悟面向?qū)ο筮@件事。我記得自己真正對面向?qū)ο笥羞^一次深入體會是在讀完《c++編程思想》,這本書的第一章是關于介紹oop的,作者通過一個面向過程的c代碼到c++的oop書寫方式,引出了面向?qū)ο蟮囊恍┚?,比如面向?qū)ο笃鋵嵤且环N思想,早期在用c的時候,也可以用面向?qū)ο蟮乃悸啡?struct+函數(shù)),但這種代碼是單向綁定的,支持面向?qū)ο蟮拇a的好處是完成方法與數(shù)據(jù)的雙向綁定。而不像struct那樣,不知道誰使用了此數(shù)據(jù)結(jié)構(gòu)。

這些關于封裝的知識理論上被稱為基于對象,但說句實在的,對于很多人而言,能在系統(tǒng)中用封裝的思想將系統(tǒng)建模就已經(jīng)很不容易了,這可能聽上去有點夸張,但仔細想想,對于一個人,一個蘋果,一張訂單讓你去建模,你可能很容易就建了,但如果是類似Controller,Action,Execute這些看上去像是動作的對象呢?

再比如一些復雜的系統(tǒng),如何抽象出領域模型,讓系統(tǒng)能夠清晰的交互,這些都不是那么容易的。再說繼承與多態(tài),其實繼承本身和多態(tài)不像是處于同一平行線的概念。這個繼承,在java中其實分繼承接口和繼承類,而繼承類則主要是為了代碼復用,只不過這種復用是靜態(tài)的,而多態(tài)更像是動態(tài)的復用。


在c++中沒有這么分類,c++提供的oop看上去更像是為數(shù)學公式準備的,所有只有繼承類這么一說,只不過你定義一個只有虛函數(shù)的類,這個類就成接口了。而且c++的繼承還包括公有繼承,保護繼承,私有繼承等等繼承權限,還有友元和多重繼承。這些東西不是沒用,而是一般人用不來,所以在java中都選擇了精簡。

在說回面向?qū)ο蟊旧?,這種編程思想說來說去都可以總結(jié)為以下幾點:

(1)所有數(shù)據(jù)都應該隱藏在它所有的類內(nèi)部。

(2)類的使用者必須依賴類的公有接口,但類不能依賴它的使用者。

(3)不要把實現(xiàn)細節(jié)放到類的公有接口中。

(4)面向?qū)ο蟮姆椒ê灻鋵嵥闶窍f(xié)議,面向?qū)ο蟮谋举|(zhì)其實是對象與對象之間發(fā)送消息。

完成了上面關于oop的回顧介紹之后,我就要引入這篇博客的主要內(nèi)容了,對象與對象之間的關系。

使用關系

簡單的來說,我這樣理解面向?qū)ο?,每個對象封裝了自己的狀態(tài)和協(xié)議,而一個對象總想使用另一個對象。總結(jié)出一個對象如何使用另一個對象的方式,就基本歸納了面向?qū)ο蠼5乃袌鼍啊?/p>

我很喜歡拿汽車和加油站的關系來舉這個例子,這個例子是我從《OOD啟示錄》這本書上讀到的。

汽車要如何使用加油站呢?

首先它可以作為參數(shù)傳遞給加油站:


或者它作為Car的一個屬性,雖然啊這看上去有點怪,好像這個車只能去指定地點加油。


不過更怪的是土豪模式,直接new一個加油站出來。


還有一種退一步的方式,是從另一個地圖對象來獲得加油站對象,不過這又引出了另一個問題,這個地圖對象是從哪來的?


以上的這些都是一個對象想使用另一個對象的方式,我要特別提醒一下那個作為一個屬性的方式,同樣是定義一個類的屬性,比如一個person有一個name屬性,那就是它擁有一個屬性,算包含關系,而如果是一個person有一個country屬性,這個時候就是關聯(lián)關系了,就像是數(shù)據(jù)庫里面的關聯(lián)字段一樣。不過更官方的叫法,其實將對象與對象的關系分為四種:依賴關系(Dependency),關聯(lián)關系(Association),聚合關系(Aggregation),組合關系(Compostion)。其中把作為局部變量,方法參數(shù),或者調(diào)用一個類的靜態(tài)方法稱為依賴關系。而關聯(lián)關系,聚合關系,組合關系,都用成員變量的方式表現(xiàn),但是它們所表達的對象聲明周期和耦合度是不一樣的。

繼承

除了使用一個對象,還可以通過繼承的方式來獲得這份“代碼”,不過汽車繼承一個加油站看上去太奇怪了。前面提到了,多態(tài)是動態(tài)的獲得,而繼承更像是靜態(tài)的獲得,就好像編譯器把這份代碼給你拷貝過去了一樣。設計模式的書常常把繼承說的一文不值,說“用組合不用繼承”,但如果兩個類真有某種父子關系,使用組合而不是繼承看上去是很怪的,而且維護性也很差,比如你子類繼承了你的父類,那只要給父類添加一個方法,那子類是默認就獲得了,但是如果你使用了組合,你就不能方便的擁有這些方法,要一個個的子類去引用這個新的實現(xiàn)。


多重繼承

提到繼承就不得不提到多重繼承,這個東西在java這種語言中被禁用了,很多人說java可以實現(xiàn)多個接口,但是接口和繼承類完全不是一個概念,繼承類是重用,那接口有能啥重用的地方?充其量是定義協(xié)議而已。多重繼承這個思想本身沒有問題,比如一個木頭門繼承于門和木頭兩個父類。這樣任何一個父類添加一個新的屬性或方法,都會默認被木頭門繼承,這是很自然的建模。而一個木頭門有兩個屬性分別是門和木頭,這個就很詭異。多重繼承比較被人抨擊的主要是那種鉆石繼承,父類之間簽名相同之類的問題,不過有些語言會提供“限制版”的多重繼承,來既讓你使用多重繼承,又不會提升代碼的復雜度。比如Mixin(混入類)。

元類

最后在說說元類,這個概念來源于元編程,什么是元編程,就是編寫生成代碼的代碼。比如DSL,比如c++中的模板,元類呢就算是用來創(chuàng)建類的類。這個我在python中偶爾會使用一下。一個簡單的入門是你可以用type來創(chuàng)建一個類對象(type就是元類)。

不過大多數(shù)的使用場景是設置類的__metaclass__屬性,而在創(chuàng)建這個類的時候,擴展這個類。

今天的分享就到這里了,希望對大家有幫助~

不懂就問,對于準備學習編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!

微信公眾號:C語言編程學習基地

整理分享(多年學習的源碼、項目實戰(zhàn)視頻、項目筆記,基礎入門教程)

歡迎轉(zhuǎn)行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!



C++編程知識解析:如何理解面向?qū)ο笾校瑢ο笈c對象的關系?的評論 (共 條)

分享到微博請遵守國家法律
浦城县| 什邡市| 洱源县| 读书| 登封市| 永靖县| 宝清县| 德庆县| 青海省| 读书| 佳木斯市| 赫章县| 临江市| 瑞昌市| 永城市| 田阳县| 丽江市| 措勤县| 龙胜| 庆阳市| 湟源县| 沈阳市| 霍林郭勒市| 灵川县| 辽源市| 开远市| 河津市| 栾川县| 大连市| 恩施市| 岱山县| 老河口市| 长白| 河池市| 临邑县| 南和县| 清丰县| 绥江县| 即墨市| 隆安县| 农安县|