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