摘要:利用計(jì)算機(jī)來對(duì)事物進(jìn)行抽象并使用便是面向?qū)ο缶幊獭1焕^承的類稱為基類,繼承基類的新類稱為導(dǎo)出類。所以可以將導(dǎo)出類的實(shí)例對(duì)象賦給基類,作為一個(gè)基類對(duì)象使用。所以在一個(gè)基類對(duì)象上調(diào)用導(dǎo)出類的新功能者并沒有什么意義,也不符合現(xiàn)實(shí)。
從崛起的智人到被蘋果砸中的牛頓再到現(xiàn)在的你,一直在思考“這是個(gè)怎么樣的世界?”一、世上本沒有蘋果
看到一張?zhí)O果的圖片,腦海里自然浮現(xiàn)“圖片上的是一個(gè)蘋果”,為什么會(huì)稱蘋果為‘蘋果’?
世界上所有的物質(zhì)都是客觀存在的,基于事物固有的特性,人類用自己方式將其抽象為具體的概念并用一些媒介表達(dá)了出來,這些媒體如語言、繪畫、手語等。
將客觀存在事物抽象為我們自己的概念,便能方便日常的交流和對(duì)事物的研究利用。對(duì)事物進(jìn)行抽象定義的質(zhì)量越高,我們使用起來越方便。在日常生活中,當(dāng)提及到這些事物時(shí)我們對(duì)這些事物的特征、功能也總是‘心中有數(shù)’。
我們解決問題的能力直接取決于我們對(duì)事物抽象的質(zhì)量。
二、使用計(jì)算機(jī)來表達(dá)事物的抽象計(jì)算機(jī)也是我們表達(dá)和使用抽象的一種有效媒介。
進(jìn)行程序設(shè)計(jì)的目的就是解決實(shí)際生活中一些的問題,程序總是和實(shí)際息息相關(guān)的。將實(shí)際問題中元素用計(jì)算機(jī)的方式來進(jìn)行抽象定義,然后利用這些抽象來解決問題。這樣我們直面的便問題空間中的抽象,在解決問題是基于問題的結(jié)構(gòu),而不是基于計(jì)算機(jī)結(jié)構(gòu)。
不使用面向?qū)ο髸r(shí),可能寫出下面的代碼(偽代碼):
/*將一個(gè)用戶信息保存到文件*/ userName = "xxxx"; userAge = "18"; userTel = "11111"; fileName = "xxxxxx"; // 保存信息到文件 file = open(fileName); file.write(userName); file.write(userAge); file.write(userTel); file.close();
這樣的代碼用戶相關(guān)信息在碼層面并沒有提現(xiàn)出強(qiáng)烈的相關(guān),他們都只是一個(gè)個(gè)獨(dú)立的變量。只有我們自己知道他們是‘一起’的,并實(shí)時(shí)維護(hù)他的關(guān)系。在保存信息到文件時(shí),總時(shí)要打開、寫入、關(guān)閉,對(duì)于很多個(gè)信息就繁瑣且復(fù)雜。
使用面向?qū)ο髞斫鉀Q這個(gè)問題,先將用戶信息抽象出來并將抽象的定義的類放到一個(gè)多帶帶的文件中:
class UserInfo { name; age; tel; FILE_NAME = "xxxxxx"; function saveUserInfo() { file = open(FILE_NAME); file.write(userName); file.write(userAge); file.write(userTel); file.close(); } }
這里,用戶的各個(gè)信息一目了然的他們是‘一起’的,并且將寫的操作也進(jìn)行了抽象封裝。在解決問題的代碼文件中使用定義好的抽象:
userUnfo = new UserInfo(); userInfo.name = "xxx"; userInfo.age = 18; userInfo.tel = "11111"; userinfo.saveUserInfo();
這一部分代碼才是我們真正需要的用來解決問題的代碼。這里我們不必時(shí)刻小心的維護(hù)用戶信息各個(gè)部分是"一起"的,在這他們都屬于UserInfo的屬性,保存文件時(shí)也不必再考慮其實(shí)現(xiàn)的細(xì)節(jié),這些細(xì)節(jié)我們已經(jīng)做好了封裝,在這里只需要使用就行。
利用計(jì)算機(jī)來對(duì)事物進(jìn)行抽象并使用便是面向?qū)ο缶幊獭?/strong>
三、面向?qū)ο蟮娜齻€(gè)特性將水燒開,我們需要熱水器和電。將水倒入插電的熱水器,打開開關(guān)將水燒開。在這個(gè)過程中我們并不關(guān)心熱水器的具體實(shí)現(xiàn),也不關(guān)心電是這產(chǎn)生的等等,這些所有的東西都是“封裝”好的,我們只使用好這些東西就行。
編程來解決這個(gè)問題時(shí),何不妨同樣先將熱水器等的屬性和功能進(jìn)行封裝。然后在使用這些封裝好的元素來解決問題,就如同實(shí)際中一樣自然流暢。而不是在每個(gè)步驟都調(diào)用計(jì)算機(jī)相關(guān)的特性來實(shí)現(xiàn),這樣會(huì)讓整個(gè)問題和計(jì)算機(jī)的實(shí)現(xiàn)混合不清。
類與對(duì)象:
面向?qū)ο笾杏妙悂砻枋鍪挛锏膶傩院凸δ埽瑢?duì)事物進(jìn)行抽象便是抽象為一個(gè)類。
對(duì)象是類的一個(gè)具體實(shí)例。如某天看到的一只鳥,這只鳥便是鳥類的一個(gè)具體實(shí)例。
通過定義類將問題空間中元素的進(jìn)行了封裝,然后實(shí)例化類的對(duì)象來為問題的求解提供服務(wù)。
類也是自定義的數(shù)據(jù)類型:
一個(gè)類定義完成后便是一個(gè)我們自己定義的數(shù)據(jù)類型。像創(chuàng)建內(nèi)置類型的變量一樣創(chuàng)建類的變量(即類的對(duì)象),然后操作這些對(duì)象。每個(gè)對(duì)象都有其類的特性,而每一個(gè)對(duì)象有是獨(dú)立的一個(gè)變量。
生活中使用程序提供的服務(wù)來解決問題,而程序的又調(diào)用各個(gè)對(duì)象提供的服務(wù)來來實(shí)現(xiàn)。這些對(duì)象和實(shí)際問題中的各個(gè)元素一樣,通過調(diào)用這些元素完成特定的功能來解決問題。對(duì)象的調(diào)用便是調(diào)用對(duì)象的方法,每一個(gè)方法滿足了特定的需求。
在面向?qū)ο笾幸磺卸际菍?duì)象,每個(gè)對(duì)象提供服務(wù)或數(shù)據(jù)給其他對(duì)象,對(duì)象之間互相調(diào)用和傳遞數(shù)據(jù)來解決問題
一個(gè)新類和原有類具有相似的功能,只是添加了部分新功能或部分功能不一樣,我們又得重新定義重復(fù)的功能,這樣顯得很麻煩,代碼不具備復(fù)用性。 這類需求在面向?qū)ο笾惺褂美^承來處理。
通過繼承新的類便具備了原有類的功能和特性的同時(shí)又可以進(jìn)行自己的擴(kuò)展創(chuàng)建出一個(gè)新類。被繼承的類稱為基類,繼承基類的新類稱為導(dǎo)出類。通常將一些共性和核心創(chuàng)建為基類,再通過繼承來創(chuàng)建新不同實(shí)現(xiàn)的新類。
繼承時(shí),導(dǎo)出類繼承了基類所有的特性和功能,這也就意味著所有對(duì)基類的調(diào)用,在導(dǎo)出類中同樣也具有并可以調(diào)用,如此意味著導(dǎo)出類與基類是同一的類型。但基類與導(dǎo)出類卻不是同一類型,因?yàn)閷?duì)導(dǎo)出類添加的新特性基類并不具備。
所以可以將導(dǎo)出類的實(shí)例對(duì)象賦給基類,作為一個(gè)基類對(duì)象使用。但這時(shí)是并不可以訪問導(dǎo)出類的新方法,畢竟導(dǎo)出類同基類是同一類型,但基類同導(dǎo)出類不是同一類型,因?yàn)閷?dǎo)出類會(huì)添加或修改類功能。
你有很多部手機(jī),但每一部手機(jī)的充電器都是不一樣的,當(dāng)其中一部手機(jī)需要充電的時(shí),你對(duì)助理說“幫我沖下電”,助理自然會(huì)去找合適充電器,不必告訴助理手機(jī)是什么型號(hào)去找什么樣的充電器。
將這些手機(jī)進(jìn)行封裝
先將手機(jī)共有的特性封裝為一個(gè)Phone基類,基類包括充電這個(gè)共性功能。然后繼承這個(gè)類并覆蓋基類的充電方法,來實(shí)現(xiàn)每一類型的充電的具體實(shí)現(xiàn)。
生活中我們說手機(jī)充電,這里手機(jī)是一個(gè)大的類型,但我們知道該用那個(gè)一個(gè)充電器。
既然在繼承時(shí)導(dǎo)出類和基類是同一個(gè)類型,那么當(dāng)我們把一個(gè)派生類對(duì)象賦給基類時(shí),對(duì)于那些覆蓋了基類的功能,同樣也應(yīng)該知道在需要時(shí)去調(diào)用派生類的實(shí)現(xiàn)。
Phone p = new Apple(); p.charge();
通過繼承新加了Apple手機(jī)的類,然后創(chuàng)建Apple類并將它賦值給了Phone類型,那么當(dāng)調(diào)用充電時(shí)自然應(yīng)該去調(diào)用Apple自己的充電方法。
根據(jù)對(duì)象具體實(shí)現(xiàn)取去查找其對(duì)應(yīng)的方法,這就是多態(tài)。
當(dāng)然多態(tài)對(duì)于產(chǎn)生覆蓋的方法才有意義,畢竟雖然導(dǎo)出類和基類可以視為統(tǒng)一類型是因?yàn)閷?dǎo)出類繼承了基類的全部,但基類卻并不擁有導(dǎo)出類的新特性。所以在一個(gè)基類對(duì)象上調(diào)用導(dǎo)出類的新功能者并沒有什么意義,也不符合現(xiàn)實(shí)。畢竟在生活中我們可以說交通工具載貨,但并不會(huì)說交通工具起飛,而是說飛機(jī)起飛。但對(duì)于導(dǎo)出類覆蓋基類的方法,導(dǎo)出類和基類都有這樣功能,只是實(shí)現(xiàn)不同,所以多態(tài)在此時(shí)顯得有意義且必要。*建議
如果新的類只是單純的繼承而沒有添加任何新的特性,這就意味著導(dǎo)出類和基類屬性和方法完全相同,然而這樣并沒有什么特別的意義,建議導(dǎo)出類與基類存在一定的差異。
產(chǎn)生差異:在導(dǎo)出類中添加新的特性或覆蓋
在需要時(shí)才使用繼承,處處使用繼承是不合理的且會(huì)導(dǎo)致設(shè)計(jì)過分復(fù)雜和難以維護(hù)。是否使用繼承:導(dǎo)出類與基類是否為“是一個(gè)的關(guān)系”,并具有意義,列如一個(gè)圓是一個(gè)幾何”
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68078.html
摘要:聲明式編程一種編程范式,與命令式編程相對(duì)立。常見的聲明式編程語言有數(shù)據(jù)庫查詢語言,正則表達(dá)式邏輯編程函數(shù)式編程組態(tài)管理系統(tǒng)等。函數(shù)式編程,特別是純函數(shù)式編程,嘗試最小化狀態(tài)帶來的副作用,因此被認(rèn)為是聲明式的。 編程范式與函數(shù)式編程 一、編程范式的分類 常見的編程范式有:函數(shù)式編程、程序編程、面向?qū)ο缶幊獭⒅噶钍骄幊痰取T诿嫦驅(qū)ο缶幊痰氖澜纾绦蚴且幌盗邢嗷プ饔茫ǚ椒ǎ┑膶?duì)象(Class...
摘要:為什么要采用面向?qū)ο缶幊探鉀Q問題更容易設(shè)計(jì)計(jì)算機(jī)程序就是為了解決人類的問題。面向?qū)ο缶幊绦枰獙?duì)業(yè)務(wù)及代碼的架構(gòu)是有一定的要求的。 1. 編程方式 我們目前的編程方式大體可以有以下三種編程方式: 順序編程 過程式編程 面向?qū)ο缶幊? 在講面向?qū)ο缶幊虝r(shí)先講一下什么是順序編程,什么是過程式編程,什么是面向?qū)ο缶幊蹋? 順序編程: 就是只用一個(gè)單線程去執(zhí)行一段代碼,執(zhí)行過程根據(jù)代碼依次從上...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:面向?qū)ο竺嫦驅(qū)ο蟮母攀雒嫦驅(qū)ο笫鞘裁疵嫦驅(qū)ο缶幊痰娜Q是,簡稱。面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建基于現(xiàn)實(shí)世界模型的一種編程。面向?qū)ο缶幊炭梢钥醋鍪鞘褂靡幌盗袑?duì)象相互協(xié)作的軟件設(shè)計(jì)。面向?qū)ο缶幊痰纳礁柚饕奶卣魇欠庋b繼承多態(tài)。 面向?qū)ο?面向?qū)ο蟮母攀?面向?qū)ο笫鞘裁?面向?qū)ο缶幊痰娜Q是Object Oriented Programming,簡稱OOP。面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建基于現(xiàn)實(shí)...
閱讀 995·2023-04-25 14:45
閱讀 2772·2021-09-30 09:59
閱讀 3114·2021-09-22 15:48
閱讀 2424·2019-08-30 15:55
閱讀 3467·2019-08-30 15:44
閱讀 535·2019-08-29 14:07
閱讀 3412·2019-08-26 13:45
閱讀 535·2019-08-26 11:31