日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

知识点总结(什么是面向对象)

發(fā)布時(shí)間:2023/12/13 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 知识点总结(什么是面向对象) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、這個(gè)對(duì)象指的是什么 (個(gè)人理解,)

這個(gè)對(duì)象指的不是C#中的實(shí)例,這個(gè)對(duì)象是個(gè)抽象的,在我的理解中,面向?qū)ο筮@個(gè)對(duì)象是我們需要實(shí)現(xiàn)的東西,簡(jiǎn)單說(shuō)就比如我現(xiàn)在需要編寫(xiě)一段游戲代碼,就拿目前最火的LOL來(lái)講,在游戲中有100+的英雄,每個(gè)英雄都有屬于自己的屬性比如說(shuō)

這個(gè)時(shí)候我們就將這個(gè)英雄作為一個(gè)對(duì)象,100+的英雄就調(diào)用這一個(gè)封裝好的英雄對(duì)象來(lái)實(shí)現(xiàn)這100+的英雄,否則需要重新寫(xiě)100+的重復(fù)代碼。

二、為什么要面向?qū)ο螅?/p>

面向?qū)ο笫窍胍鉀Q系統(tǒng)的可維護(hù)性、可擴(kuò)展性、可重用性,我們?cè)诳紤]下為什么要用面向?qū)ο髞?lái)解決呢?

作者:匿名用戶
鏈接:https://www.zhihu.com/question/27468564/answer/101951302
來(lái)源:知乎

當(dāng)軟件還非常簡(jiǎn)單的時(shí)候,我們只需要面向過(guò)程編程:

定義函數(shù)
函數(shù)一
函數(shù)二
函數(shù)三
函數(shù)四

定義數(shù)據(jù)
數(shù)據(jù)一
數(shù)據(jù)二
數(shù)據(jù)三
數(shù)據(jù)四

最后
各種函數(shù),數(shù)據(jù)的操作。

當(dāng)軟件發(fā)展起來(lái)后,我們的軟件變得越來(lái)越大,代碼量越來(lái)越多,復(fù)雜度遠(yuǎn)超Hello World的時(shí)候,我們的編寫(xiě)就有麻煩了:

函數(shù)和數(shù)據(jù)會(huì)定義得非常多,面臨兩個(gè)問(wèn)題。

首先是命名沖突,英文單詞也就那么幾個(gè),可能寫(xiě)著寫(xiě)著取名時(shí)就沒(méi)合適的短詞用了,為了避免沖突,只能把函數(shù)名取得越來(lái)越長(zhǎng)。

然后是代碼重復(fù),比如你做一個(gè)計(jì)算器程序,你的函數(shù)就要確保處理的是合理的數(shù)據(jù),這樣最起碼加減乘除四個(gè)函數(shù)里,你就都要寫(xiě)對(duì)參數(shù)進(jìn)行檢測(cè)的代碼,寫(xiě)四遍或者復(fù)制粘貼四遍不會(huì)很煩,但多了你就痛苦了,而且因?yàn)檫@些檢測(cè)代碼是跟你的加減乘除函數(shù)的本意是無(wú)關(guān)的,卻一定要寫(xiě)在那里,使代碼變得不好閱讀,意圖模糊。

就算一個(gè)網(wǎng)絡(luò)小說(shuō)的作者,他每次寫(xiě)新章節(jié)時(shí)也不大可能直接打開(kāi)包含著前面幾百章文字的文檔接著寫(xiě)。更正常的做法是新建一個(gè)文檔,寫(xiě)新的一章,為的是減小復(fù)雜性,減少干擾。更何況代碼那么復(fù)雜那么容易出錯(cuò)的東西。

隨著軟件業(yè)的發(fā)展,解決辦法就要出來(lái)了。

代碼重復(fù),我們可以用函數(shù)里面調(diào)用函數(shù)的方法,比如把檢測(cè)代碼抽出來(lái)成一個(gè)獨(dú)立函數(shù),然后加減乘除四個(gè)函數(shù)運(yùn)行時(shí)只要調(diào)用一下檢測(cè)函數(shù)對(duì)參數(shù)進(jìn)行檢查就可以了。分布在四個(gè)函數(shù)里的重復(fù)代碼變成了一個(gè)函數(shù),是不是好維護(hù)多了。

命名沖突,我們就把這一堆函數(shù)們進(jìn)行分類(lèi)吧。

比如沒(méi)有分類(lèi)時(shí)候,我們?nèi)∶荒苋∶?/p>

檢測(cè)
整數(shù)加
整數(shù)減
整數(shù)乘
整數(shù)除
復(fù)數(shù)加
復(fù)數(shù)減
復(fù)數(shù)乘
復(fù)數(shù)除
小數(shù)加
...

進(jìn)行歸類(lèi)后

整數(shù) {
   檢測(cè)
   加
   減
   乘
   除
}
復(fù)數(shù) {
   檢測(cè)
   加
   減
   乘
   除
}
小數(shù) {
   檢測(cè)
   加
   減
   乘
   除
}
分?jǐn)?shù) {
   檢測(cè)
   加
   減
   乘
   除
}

是不是一種叫做類(lèi)的概念就呼之欲出了,這樣我們打開(kāi)一個(gè)整數(shù)類(lèi)代碼文件,里面就是簡(jiǎn)簡(jiǎn)單單的加減乘除四個(gè)函數(shù),簡(jiǎn)單清晰而不會(huì)跟外面的其他加減乘除函數(shù)命名沖突。

當(dāng)然,進(jìn)行歸類(lèi)后,又有各種的問(wèn)題和解決辦法了,比如四個(gè)類(lèi)中的檢測(cè)也是應(yīng)該提取出來(lái)的,所以簡(jiǎn)單的起因最終發(fā)展出什么繼承衍生之類(lèi)挺復(fù)雜的一套編程模式。然后學(xué)術(shù)界那幫人就又亂起什么高大上的名字了,所謂面向?qū)ο蟪绦蛟O(shè)計(jì)去禍害大學(xué)里那幫孩子。

就算未來(lái)出來(lái)一個(gè)什么新的面向XX編程,我們也不用多想為什么會(huì)出現(xiàn),肯定是為了解決麻煩而已。

上面進(jìn)行歸類(lèi)后,代碼其實(shí)還是不好維護(hù)的,然后我們就繼續(xù)提取為:

數(shù) {
    檢測(cè)
    加
    減
    乘
    除
}
整數(shù) {
    沿用上面數(shù)的設(shè)計(jì)
}
小數(shù) {
    沿用上面數(shù)的設(shè)計(jì)
}

所謂繼承,就是數(shù)這個(gè)類(lèi)的整體設(shè)計(jì),沿用給整數(shù),分?jǐn)?shù)小數(shù)這些類(lèi),作為他們的編寫(xiě)大綱去編寫(xiě)加減乘除這些函數(shù)的具體代碼。根據(jù)整數(shù),分?jǐn)?shù),小數(shù)各自的性質(zhì),做出各自的調(diào)整。

這時(shí)數(shù)這個(gè)類(lèi),如果你給它里面的加減乘除函數(shù)的寫(xiě)了一些很粗糙簡(jiǎn)單的代碼,就叫做父類(lèi),基礎(chǔ)類(lèi)。子類(lèi)們“繼承”了父類(lèi)(把代碼進(jìn)行了復(fù)雜化)。

如果沒(méi)寫(xiě),那這個(gè)類(lèi)其實(shí)就只是個(gè)設(shè)計(jì)圖,叫做抽象類(lèi)。子類(lèi)們“實(shí)現(xiàn)”了抽象類(lèi)(把空空的設(shè)計(jì)變成了具體代碼)。

模版是什么?像C++這種復(fù)雜成狗的語(yǔ)言是強(qiáng)類(lèi)型的,就是給變量進(jìn)行了類(lèi)型區(qū)分的,比如整數(shù)類(lèi)型,雙整數(shù)類(lèi)型。很明顯這兩種變量所能容納的數(shù)據(jù)體積是不一樣的,單個(gè)函數(shù)不能通吃多種類(lèi)型的參數(shù),我們就可能會(huì)面臨下面兩套代碼并存的局面。

單整數(shù)類(lèi) {
    單整數(shù)加
    單整數(shù)減
    單整數(shù)乘
    單整數(shù)除
}
雙整數(shù)類(lèi) {
    雙整數(shù)加
    雙整數(shù)減
    雙整數(shù)乘
    雙整數(shù)除
}

所以C艸跟其他強(qiáng)類(lèi)型語(yǔ)言為我們提供了一個(gè)所謂模版功能:

<變量類(lèi)型>整數(shù) {
    <變量類(lèi)型>加
    <變量類(lèi)型>減
    <變量類(lèi)型>乘
    <變量類(lèi)型>除
}

整數(shù)類(lèi)等于把變量類(lèi)型設(shè)置為整數(shù),套上模版 雙整數(shù)類(lèi)等于把變量類(lèi)型設(shè)置為雙整數(shù),套上模版

這樣就寫(xiě)了一份代碼,得到了兩份類(lèi)的代碼。

當(dāng)然,弱類(lèi)型的編程語(yǔ)言,比如JavaScript或者PHP是沒(méi)有這種煩惱的,因?yàn)樽兞繘](méi)有類(lèi)型之分。但變量類(lèi)型有時(shí)候還是很重要的,弱類(lèi)型語(yǔ)言里就會(huì)出現(xiàn)類(lèi)似數(shù)加字符串這種運(yùn)算,可能并不是程序員的預(yù)期和本意,所以比起強(qiáng)類(lèi)型性語(yǔ)言而言經(jīng)常會(huì)出現(xiàn)很多無(wú)聊的BUG。

再更新:

上面發(fā)展出了父類(lèi)之后,我們發(fā)現(xiàn)編程還是有問(wèn)題的,小數(shù)類(lèi):

小數(shù)類(lèi) {
    加
    減
    乘
    除
}

如果我們需要一個(gè)能自動(dòng)實(shí)現(xiàn)結(jié)果四舍五入的小數(shù)計(jì)算類(lèi),同時(shí)又需要一個(gè)不需要的,怎么辦呢,難道要寫(xiě)兩個(gè)類(lèi)嗎?不要。

所以做出了“實(shí)例”或者“對(duì)象”這一東西,首先把類(lèi)改成:

小數(shù)類(lèi) {
    標(biāo)識(shí)變量:是否四舍五入
    標(biāo)識(shí)變量:是否限定小數(shù)點(diǎn)后位數(shù)
    構(gòu)造函數(shù)(設(shè)置上面的標(biāo)識(shí))
    加(會(huì)根據(jù)上面兩個(gè)標(biāo)識(shí)變量輸出不同結(jié)果)
    減(會(huì)根據(jù)上面兩個(gè)標(biāo)識(shí)變量輸出不同結(jié)果)
    乘(會(huì)根據(jù)上面兩個(gè)標(biāo)識(shí)變量輸出不同結(jié)果)
    除(會(huì)根據(jù)上面兩個(gè)標(biāo)識(shí)變量輸出不同結(jié)果)
}

這樣,我們就寫(xiě)一個(gè)類(lèi),但是通過(guò)構(gòu)造函數(shù),把一份代碼,構(gòu)造出了行為稍微有點(diǎn)不同的兩個(gè)實(shí)例供我們使用,這時(shí)候名詞來(lái)了,不能進(jìn)行實(shí)例化微調(diào)化的類(lèi),叫做靜態(tài)類(lèi),函數(shù)們的行為是固定的。不能實(shí)例化的類(lèi),其實(shí)只是函數(shù)們的一個(gè)集合歸納,只是對(duì)函數(shù)進(jìn)行了整理,功能的強(qiáng)大和編碼的自由靈活度是不夠的。

能夠進(jìn)行實(shí)例化,變化出各種行為各自不大一樣的實(shí)例的類(lèi),我們一般就把它們叫做類(lèi)了,因?yàn)樽畛R?jiàn)。

看完之后是不是覺(jué)得恍然大悟呢?面向?qū)ο鬁p少了我們的代碼書(shū)寫(xiě)量,將可以重復(fù)使用的代碼進(jìn)行封裝,

講到這里再說(shuō)下面向?qū)ο蟮娜筇卣鳎麄兎謩e是封裝,繼承和多態(tài)

封裝:找到變化并且把它封裝起來(lái),你就可以在不影響其它部分的情況下修改或擴(kuò)展被封裝的變化部分,這是所有設(shè)計(jì)模式的基礎(chǔ),就是封裝變化,因此封裝的作用,就解決了程序的可擴(kuò)展性。

繼承:子類(lèi)繼承父類(lèi),可以繼承父類(lèi)的方法及屬性,實(shí)現(xiàn)了多態(tài)以及代碼的重用,因此也解決了系統(tǒng)的重用性和擴(kuò)展性,但是繼承破壞了封裝,因?yàn)樗菍?duì)子類(lèi)開(kāi)放的,修改父類(lèi)會(huì)導(dǎo)致所有子類(lèi)的改變,因此繼承一定程度上又破壞了系統(tǒng)的可擴(kuò)展性,所以繼承需要慎用,只有明確的IS-A關(guān)系才能使用,同時(shí)繼承在在程序開(kāi)發(fā)過(guò)程中重構(gòu)得到的,而不是程序設(shè)計(jì)之初就使用繼承,很多面向?qū)ο箝_(kāi)發(fā)者濫用繼承,結(jié)果造成后期的代碼解決不了需求的變化了。因此優(yōu)先使用組合,而不是繼承,是面向?qū)ο箝_(kāi)發(fā)中一個(gè)重要的經(jīng)驗(yàn)。

多態(tài):接口的多種不同的實(shí)現(xiàn)方式即為多態(tài)。接口是對(duì)行為的抽象,剛才在封裝提到,找到變化部分并封裝起來(lái),但是封裝起來(lái)后,怎么適應(yīng)接下來(lái)的變化?這正是接口的作用,接口的主要目的是為不相關(guān)的類(lèi)提供通用的處理服務(wù),我們可以想象一下。比如鳥(niǎo)會(huì)飛,但是超人也會(huì)飛,通過(guò)飛這個(gè)接口,我們可以讓鳥(niǎo)和超人,都實(shí)現(xiàn)這個(gè)接口,這就實(shí)現(xiàn)了系統(tǒng)的可維護(hù)性,可擴(kuò)展性。

因此面向?qū)ο竽軐?shí)現(xiàn)人們追求的系統(tǒng)可維護(hù)性,可擴(kuò)展性,可重用性。面向?qū)ο笫且环N編程思想,起初,“面向?qū)ο蟆笔菍?zhuān)指在程序設(shè)計(jì)中采用封裝、繼承、多態(tài)等設(shè)計(jì)方法,但面向?qū)ο蟮乃枷胍呀?jīng)涉及到軟件開(kāi)發(fā)的各個(gè)方面,比如現(xiàn)在細(xì)分為了面向?qū)ο蟮姆治?OOA),面向?qū)ο蟮脑O(shè)計(jì)(OOD),面向?qū)ο蟮木幊虒?shí)現(xiàn)(OOP)

三、面向?qū)ο蟮膶?shí)現(xiàn)

面向?qū)ο笫且环N思想,他讓我們?cè)诜治龊徒鉀Q問(wèn)題時(shí),把思維和重點(diǎn)轉(zhuǎn)向現(xiàn)實(shí)中的載體中來(lái),它分為面向?qū)ο蟮姆治?OOA),面向?qū)ο蟮脑O(shè)計(jì)(OOD),面向?qū)ο蟮木幊虒?shí)現(xiàn)(OOP)三個(gè)大的步驟。

1、首先是分析需求,先不要思考怎么用程序?qū)崿F(xiàn)它,先分析需求中穩(wěn)定不變的內(nèi)容都是些什么,這些內(nèi)容之間的關(guān)系是什么。

2、把第一步分析出來(lái)的需求,通過(guò)進(jìn)一步擴(kuò)充模型,變成可實(shí)現(xiàn)的、符合成本的、模塊化的、低耦合高內(nèi)聚的模型。

3、開(kāi)始動(dòng)手實(shí)現(xiàn)這個(gè)模型~

總結(jié)

以上是生活随笔為你收集整理的知识点总结(什么是面向对象)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。