我目前在英國(guó)讀大一計(jì)算機(jī),是個(gè)超級(jí)菜鳥(niǎo),我不太明白什么是object oriented。。。中文翻譯過(guò)來(lái)似乎是面向?qū)ο螅ㄓ锌赡芊g錯(cuò)了)。 我搜索過(guò)有關(guān)于他的解釋,但是還是不是很明白,都解釋的太專業(yè)了,請(qǐng)問(wèn)又問(wèn)能夠很簡(jiǎn)單明了并且完整的給我解釋一下什么是object oriented么? 謝謝大家了
我們?cè)诳创F(xiàn)實(shí)世界的問(wèn)題時(shí),會(huì)發(fā)現(xiàn)任何一個(gè)事物有自身的屬性,標(biāo)誌了TA是什麼,還有這個(gè)事物的行為,用來(lái)和其他事物進(jìn)行交互。
麵向?qū)ο缶褪沁@麼一種思想,建模時(shí),將問(wèn)題抽象成很多對(duì)象。通過(guò)對(duì)象之間的交互將問(wèn)題解決。
麵向?qū)ο蟮膬?yōu)點(diǎn)主要在兩個(gè)方麵:
我們?nèi)粘I畹乃季S模式也是麵向?qū)ο蟮?,我們常常?huì)說(shuō),誰(shuí)誰(shuí)誰(shuí)能做什麼,給TA相應(yīng)的需求,TA就是個(gè)對(duì)象。在需求分析時(shí),比較容易建模。
程序?qū)崿F(xiàn)之後,具有比較好的可維護(hù)性,可重用性和可擴(kuò)展性。
因?yàn)閷?duì)象是獨(dú)立的,所以A項(xiàng)目中用TA可以,B項(xiàng)目也可以用TA,我們也可以通過(guò)繼承來(lái)對(duì)對(duì)象進(jìn)行擴(kuò)展改變。
因?yàn)閷?duì)象是封裝的,所以除非接口發(fā)生變化,否則對(duì)象內(nèi)部實(shí)現(xiàn)的變化並不會(huì)影響與外部的交互。
object oriented,麵向?qū)ο?,?jiǎn)單來(lái)說(shuō),是一種編程的套路。
編程(programing),就是利用已有的信息產(chǎn)生新的信息。
具體來(lái)說(shuō),我們首先將已有的信息轉(zhuǎn)化成數(shù)據(jù)(Data),然後通過(guò)操作這些數(shù)據(jù),得出新的數(shù)據(jù),新的數(shù)據(jù)就包含了新的信息。操作這些數(shù)據(jù)的方法,我們稱之為函數(shù)(Function)。
從這個(gè)角度來(lái)說(shuō),程序(program)就是一堆數(shù)據(jù)和函數(shù),編程就是設(shè)計(jì)和組織數(shù)據(jù)和函數(shù)。
不同的設(shè)計(jì)和組織的方式,就叫做編程的套路,或者說(shuō),範(fàn)式(paradigm)。其中,麵向?qū)ο缶褪枪?fàn)式之一。
麵向?qū)ο蟮暮诵模褪菍⒛承?shù)據(jù)和用於操作這些數(shù)據(jù)的函數(shù)封裝(encapsulate)在一起。
被封裝進(jìn)對(duì)象的函數(shù),稱為該對(duì)象的方法(method)。
因?yàn)閿?shù)據(jù)和函數(shù)都被封裝進(jìn)對(duì)象了,所以當(dāng)我們需要操作某些數(shù)據(jù)的時(shí)候,我們就向相應(yīng)的對(duì)象傳遞一個(gè)消息(pass a message),要求這個(gè)對(duì)象返回我們需要的答案。對(duì)象收到消息後,調(diào)用封裝在自身內(nèi)部的方法,計(jì)算出答案,然後回傳給我們一個(gè)包含答案的消息。
以上就是「麵向?qū)ο蟆沟幕驹怼?
「麵向?qū)ο蟆沟暮锰幇褦?shù)據(jù)和相應(yīng)的函數(shù)封裝在一起,達(dá)到界麵和實(shí)現(xiàn)的分離。這樣的話,下層的改動(dòng)不會(huì)影響上層。我們前麵已經(jīng)說(shuō)了,對(duì)象內(nèi)部的方法,本質(zhì)上是函數(shù),這個(gè)函數(shù)的定義,我們稱為方法的實(shí)現(xiàn)。隻要這個(gè)方法對(duì)外提供的接口沒(méi)有變,那麼對(duì)對(duì)象內(nèi)部的方法的實(shí)現(xiàn)(也就是函數(shù)定義)的改變,不會(huì)影響程序的其他部分。
當(dāng)然,麵向?qū)ο笠灿袎奶?。最突出的是,如果一味?qiáng)調(diào)「一切都是對(duì)象」,強(qiáng)迫所有的編程都按照麵向?qū)ο蟮奶茁穪?lái),完全不允許其他套路,就會(huì)導(dǎo)致一些繁瑣的設(shè)計(jì)。
理解了基本原理,再理解其他概念就容易了。
如果有一些對(duì)象是相似的,那麼相應(yīng)地,操作它們的函數(shù)(方法)應(yīng)該也是相似的。這時(shí)如何共享方法,避免重複?
一種思路是引入類(class)這個(gè)概念,就是將相似的對(duì)象都作為一類。然後類也是對(duì)象,也有綁定的函數(shù)或者方法。這些類的方法,可以被屬於該類的對(duì)象們共享。同理,相似的類,還可以歸到更大的類去。這就形成了父類和子類的概念。子類可以繼承父類的方法,同理,可以繼承爺爺類(父類的父類)的方法。
上麵是單線的繼承,就是說(shuō)一個(gè)類隻能從自己的祖先那裏繼承方法。這有時(shí)不方便。一種思路是允許一個(gè)類有多個(gè)父類,這是多重繼承。另一種思路是允許類從其他類借用方法,這是mixin。
和類相對(duì)的思路,是引入原型(prototype)的概念。如果A對(duì)象和B對(duì)象相似,用類來(lái)處理,那就是構(gòu)造一個(gè)類C,然後將A和B作為類C的兩個(gè)實(shí)例。如果用原型來(lái)處理,那就是以A作為原型,構(gòu)造一個(gè)B。
在這兩條思路的基礎(chǔ)上,又形成了更多的概念,以及相應(yīng)的一些編程的慣例,這裏就不介紹了。
至於具體的編程語(yǔ)言,是否提供機(jī)製可以實(shí)現(xiàn)麵向?qū)ο缶幊?,是否原生支持麵向?qū)ο?,以何種方式支持,是否隻支持麵向?qū)ο缶幊?,那是另一個(gè)問(wèn)題。
繼續(xù)拋磚引玉……
就是麵向?qū)ο蟮囊馑?。區(qū)別於麵向過(guò)程等編程模式??梢詤⒖窗俣劝倏?/p>
可以參看Head First Java/Head First C#
麵向?qū)ο?,複雜而準(zhǔn)確的說(shuō)法相信你應(yīng)該已經(jīng)看到過(guò)了,我就不貼維基百科的鏈接了。它是一種編程範(fàn)式。
簡(jiǎn)單地說(shuō),就是你先想好係統(tǒng)裏有哪些對(duì)象,它們有哪些數(shù)據(jù)和行為。比如你做個(gè)問(wèn)答網(wǎng)站,那麼「問(wèn)題」就是一個(gè)類,「問(wèn)題」會(huì)有「標(biāo)題」、「描述」等數(shù)據(jù),「回答」、「刪除」、「關(guān)閉」、「頂」、「踩」、 「修改」等行為可以在它的實(shí)例身邊發(fā)生。圍繞這個(gè)基本思路開(kāi)展的編程活動(dòng)就叫做「麵向?qū)ο蟪绦蛟O(shè)計(jì)」。
當(dāng)然,麵向?qū)ο蟮膬?nèi)容遠(yuǎn)不止這麼多。比如繼承啦、重載啦、多態(tài)啦等等。
PS: 臺(tái)灣地區(qū)叫「物件導(dǎo)向」。