面向对象理论概述
2019獨角獸企業重金招聘Python工程師標準>>>
轉載自:http://my.oschina.net/brucelee80/blog
面向對象與面向過程的區別
? ? 面向過程就是分析出解決問題所需要的步驟,然后用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。面向對象是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
? ? ?例如五子棋,面向過程的設計思路就是首先分析問題的步驟:
1、開始游戲,
2、黑子先走,
3、繪制畫面,
4、判斷輸贏,
5、輪到白子,
6、繪制畫面,
7、判斷輸贏,
8、返回步驟2,
9、輸出最后結果。
把上面每個步驟用分別的函數來實現,問題就解決了。
? ? ?而面向對象的設計則是從另外的思路來解決問題。整個五子棋可以分為:
1、黑白雙方,這兩方的行為是一模一樣的,
2、棋盤系統,負責繪制畫面,
3、規則系統,負責判定諸如犯規、輸贏等。
?
? ? 第一類對象(玩家對象)負責接受用戶輸入,并告知第二類對象(棋盤對象)棋子布局的變化,棋盤對象接收到了棋子的變化就要負責在屏幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。
? ? 可以明顯地看出,面向對象是以功能來劃分問題,而不是步驟。同樣是繪制棋局,這樣的行為在面向過程的設計中分散在了總多步驟中,很可能出現不同的繪制版本,因為通常設計人員會考慮到實際情況進行各種各樣的簡化。而面向對象的設計中,繪圖只可能在棋盤對象中出現,從而保證了繪圖的統一。
? ? 功能上的統一保證了面向對象設計的可擴展性。比如我要加入悔棋的功能,如果要改動面向過程的設計,那么從輸入到判斷到顯示這一連串的步驟都要改動,甚至步驟之間的循序都要進行大規模調整。如果是面向對象的話,只用改動棋盤對象就行了,棋盤系統保存了黑白雙方的棋譜,簡單回溯就可以了,而顯示和規則判斷則不用顧及,同時整個對對象功能的調用順序都沒有變化,改動只是局部的。
? ? 到這里就可以很明顯的看出面向對象和面向過程的區別所在了。
?
基本概念
抽象、封裝、對象、類
? ? 面向對象的思想來解決問題,首先要做的是分析該問題包括哪些對象。問題中的實體和概念都可以抽象為對象來考慮。如上面例子中的黑白雙方、棋盤系統和規則系統等。
? ? 對象具有屬性、狀態以及行為,狀態是屬性的值,行為是屬性的邏輯操作。對象都屬于某個類,而每個對象都是某個類的實例。一個對象就是封裝了數據及操作這些數據的邏輯代碼的實例。
? ? 對具有相同屬性和行為的一組對象進行抽象,便成了類,它是對象的模板,而對象是類的實例化,每個對象都對類的屬性賦予不同的狀態,對象具有唯一性。
?
隱藏與訪問控制
? ? 封裝并不只是簡單的屬性和行為的集結,更重要的是選擇性隱藏與訪問控制。隱藏和控制那些不想提供對外訪問的屬性和行為,提供出去的便是這個對象的服務與功能。對使用者而言,隱藏了對象具體的實現,又提供了對象可控的行為。訪問控制提高了安全性,也使協作開發有章可循。
?
組合、繼承
? ? 現實世界中,類與類之間不是孤立的,它們是有聯系的。
? ? 組合是指一個類擁有另外一個類(包含關系),將一個類當做它自己的屬性。比如班級類,就可以組合學生、老師這兩個類,表示班級由學生和老師組成。
? ? 繼承是指兩個類具有父子關系,父類也稱為基類或超類,子類也稱為導出類、擴展類或派生類。比如動物類是父類,而飛禽類和走獸類則屬于子類,表示分禽類和走獸類都是動物類。凡是父類能用在的地方,都可以用子類來替代,因為子類就是父類,父類是子類的再抽象。比如說動物是生物,當然可以替換成飛禽是生物。
? ? 父類的屬性和行為,子類可以原封不動的繼承下來,也可以重寫,以實現每個子類之間各自的新特性。
? ? 對象分析時,組合和繼承到底選哪一個,是抽象分析和封裝時需要考慮的,他們各有優缺點。組合和繼承提高了對象的可復用性。
?
接口、抽象類
? ? 接口規范了服務提供的約束。比如電腦USB插槽就約束了USB的各種規范,各種廠商生產的帶有USB外接功能的數據線,都必須遵循這個接口約束規范。接口不可實例化,只有實現了接口的類才可被實例化成對象。
? ? 抽象類則更像是一個半成品,它只實現了部分功能,而其他功能必須是它的子類去完成。比如公司下發一個申報流程,必須先讓部門經理簽字,再讓部門HR簽字,這個流程是實現了的,至于每個部門的經理和HR則要每個部門具體實施時才能確定。所以,抽象類(公司申報流程)也不能直接實例化(因為公司申報流程中根本沒有具體的審批人),只能是它的子類(部門申報流程)才能被實例化對象并可用。
?
轉型
? ? 當類之間有繼承關系時,我們就說子類是父類,這個過程其實就是將子類向上轉型為父類,從一個專有類轉換成一個通用類,這總是很安全的。相反,如果將父類強制轉換為子類,稱之為向下轉型,向下轉型需要強制轉型,具有不安全性,因為通用類無法訪問專有類的專有行為。比如貓類是動物類的子類,貓類可以抓老鼠,但是向下轉型成動物可以抓老鼠,顯然就說不通;反之,如果說貓類能行走,那么向上轉型為動物類能移動,顯然是安全的。
?
多態
? ? 多態也叫動態綁定,或后期綁定。綁定是指方法調用和方法主體關聯起來。前期綁定是指在編譯時就可確定這種關聯,而后期綁定必須在程序處于運行態時才能確定。
? ? 在Java中,方法調用的默認方式是前期綁定(由編譯器和連接程序實現),當方法出現方法的重載和繼承時行為的重寫時,那么編譯期間就無法進行綁定,這就需要動態綁定。動態綁定使得同樣的一個方法,可以有多種實現方式。
? ? 比如動物類可以進食,當進食的是水時,它就和進食的是固體所表現的行為就不一樣了,這種進食行為是動物類行為的重載,是多態的表現。又比如動物類有移動的行為,而子類飛禽類的移動是飛行,子類走獸類的移動是地面上移動,此時,對于動物類的移動行為,就是多態,當動物是飛禽,移動的行為就變成了飛行的行為,如果是走獸,這個行為又變成了地面上移動,而這一切,只有在運行期才知道,因為只有真正運行起來,程序才知道,這個動物到底是飛禽還是走獸。
? ? 多態可以提供系統間的松耦合性。
轉載自:http://my.oschina.net/brucelee80/blog
轉載于:https://my.oschina.net/brucelee80/blog/284245
總結
- 上一篇: 烂泥:【解决】word复制windows
- 下一篇: springside 参考地址