1. 如何實現面向對象編程
以列印機Print對象為例,系統中只存在一台列印機,此時按以下方法提供介面,
首先,給出printer.h,裡面寫明對外的介面,
2. 什麼是面向對象編程
前言:面向對象程序設計(Object-Oriented Programming,以下簡稱OOP)是一種起源於六十年代的Simula語言,發展已經將近三十年的程序設計思想。其自身理論已經十分完善,並被多種面向對象程序設計語言(Object-Oriented Programming Language,以下簡稱OOPL)實現。如果把Unix系統看成是國外在系統軟體方面的文化根基,那麼Smalltalk語言無疑在OOPL領域和Unix持有相同地位。由於很多原因,國內大部分程序設計人員並沒有很深的OOP以及OOPL理論,很多人從一開始學習到工作很多年都只是接觸到c/c++,java,vb,delphi等靜態類型語言,而對純粹的OOP思想以及作為OOPL根基的Smalltalk以及動態類型語言知之甚少,不知道其實世界上還有一些可以針對變數不綁定類型的編程語言。而這些對比卻是深刻理解OO理論的重要部分,而國內這方面的資料也為數不多。故把自己的一些OO學習心得寫下來做為一個系列文章(一共三篇,第一篇描敘OOP的一些基本但容易被誤解的理論,第二篇主要說明各種OOPL演化和發展以及對於OOP理論的支持,第三篇主要是說模式和組件在OOP中的地位以及展望OOP的未來),由於文章描敘的只是自己對於OOP/OOPL的理解,錯誤以及淺薄之處在所難免,只是希望對大家能起到拋磚引玉的作用。
3. 什麼叫做面向對象的編程
具個例子吧.......
用戶登陸
面向過程的寫法是
if (名字和密碼正確) {}
else if (密碼錯誤) {}
....
面向對象的寫法是
try {}
catch (密碼錯誤Exception) {}
再簡單的說
面向對象就是別人給你一個東西 比如String 你處理他就是了 你不要去想他給你的String的具體數值是什麼 你是的想法是站在"處理方"的
而面向過程就是要考慮這個東西裡面的數值 再根據具體的數值來決定走向 你的想法是站在"被處理方"的
至於什麼以上說的什麼封裝 繼承 什麼的 那都是為了完成這個而必須要用到的功能 不是說有這功能就是面向對象 我也可以用JAVA寫面向過程 一樣用封裝 用繼承
OO是一種思路 是一種模式 多從這方面想就會慢慢明白了
4. 什麼叫面向對象編程
面向對象編程通俗概括如下
面向對象(Object Oriented,OO)是軟體開發方法。
面向對象的概念和應用已超越了程序設計和軟體開發,擴展到如資料庫系統、互動式界面、應用結構、應用平台、分布式系統、網路管理結構、CAD技術、人工智慧等領域。
面向對象是一種對現實世界理解和抽象的方法,是計算機編程技術發展到一定階段後的產物。
要素有以下四點
抽象
封裝性
共享性
強調對象結構而不是程序結構
面向對象程序設計
面向對象程序設計(英語:Object-oriented programming,縮寫:OOP)是一種程序設計范型,同時也是一種程序開發的方法。對象指的是類的實例。
已經被證實的是,面向對象程序設計推廣了程序的靈活性和可維護性,並且在大型項目設計中廣為應用。 此外,支持者聲稱面向對象程序設計要比以往的做法更加便於學習,因為它能夠讓人們更簡單地設計並維護程序,使得程序更加便於分析、設計、理解。反對者在某些領域對此予以否認。
當我們提到面向對象的時候,它不僅指一種程序設計方法。它更多意義上是一種程序開發方式。在這一方面,我們必須了解更多關於面向對象系統分析和面向對象設計(Object Oriented Design,簡稱OOD)方面的知識。
5. 面向對象編程是什麼意思
面向對象編程又稱OOP,是一種計算機編程架構。本質是以建立模型體現出來的抽象思維過程和面向對象的方法。
OOP的一條基本原則是計算機程序由單個能夠起到子程序作用的單元或對象組合而成。OOP達到了軟體工程的三個主要目標:重用性、靈活性和擴展性。OOP=對象+類+繼承+多態+消息,其中核心概念是類和對象。
面向對象程序設計方法是盡可能模擬人類的思維方式,使得軟體的開發方法與過程盡可能接近人類認識世界、解決現實問題的方法和過程,也即使得描述問題的問題空間與問題的解決方案空間在結構上盡可能一致,把客觀世界中的實體抽象為問題域中的對象。
(5)向對象編程擴展閱讀
面向對象程序設計以對象為核心,該方法認為程序由一系列對象組成。類是對現實世界的抽象,包括表示靜態屬性的數據和對數據的操作,對象是類的實例化。對象間通過消息傳遞相互通信,來模擬現實世界中不同實體間的聯系。在面向對象的程序設計中,對象是組成程序的基本模塊。
模型是用來反映現實世界中事物特徵的。任何一個模型都不可能反映客觀事物的一切具體特徵,只能對事物特徵和變化規律的一種抽象,且在所涉及的范圍內更普遍、更集中、更深刻地描述客體的特徵。通過建立模型而達到的抽象是人們對客體認識的深化。
6. 什麼是面向對象的編程語言啊
面向對象語言(Object-Oriented Language)是一類以對象作為基本程序結構單位的程序設計語言。指用於描述的設計是以對象為核心,而對象是程序運行時刻的基本成分。
其特點如下:
(1)任何事物都是對象。
(2)運行期的基本實體,也是一個包括數據和操作這些數據的代碼的邏輯實體。
(3)每個對象可以有自己的內存空間包含其他對象。
(4)類是具有相同類型的對象的抽象。一個對象所包含的所有數據和代碼可以通過類來構造。
(5)程序由一系列的對象組合,它們通過發送消息告訴彼此做什麼。
(6)封裝是將數據和代碼捆綁到一起,避免了外界的干擾和不確定性。
(7)一個特定類型的所有對象都可以接受同樣的消息。
(8)繼承是讓某個類型的對象獲得另一個類型的對象的特徵。
(9)每一個對象都有類型。
(10)多態是指不同事物具有不同表現形式的能力。
注意事項:
Java是一門面向對象編程語言,具有功能強大和簡單易用兩個特徵。
C語言是面向過程的程序設計語言,與C++,Java等面向對象的編程語言有所不同。
VB是一種面向對象的可視化程序設計語言,採取了事件驅動的編程機制。
(6)向對象編程擴展閱讀:
面向對象編程的優點:
易維護 :可讀性高,由於繼承的存在,即使改變需求,那麼維護也只是在局部模塊。
易擴展 :通過繼承,我們可以大幅減少多餘的代碼,並擴展現有代碼的用途;
模塊化 :封裝可以定義對象的屬性和方法的訪問級別,通過不同的訪問修飾符對外暴露安全的介面,防止內部數據在不安全的情況下被修改。
方便建模:很多時候可以使用現實生活中對象的概念抽象後稍作修改來進行建模,極大方便了建模的過程。
7. 什麼是面向對象編程
面向對象編程(Object Oriented Programming,OOP,面向對象程序設計)是一種計算機編程架構。OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。OOP 達到了軟體工程的三個主要目標:重用性、靈活性和擴展性。為了實現整體運算,每個對象都能夠接收信息、處理數據和向其它對象發送信息。
對於面向對象的理解。面向對象編程就是把自然界中的事物抽象成一個類,這個類可能會有一些屬性。比如說把「人」抽象成一個類,那麼人有身高、體重、三圍等等屬性。同時這個類可能會有一些方法,比如「人」可以吃喝(對自己的影響是增加體力)、可以走路和跑跳(~使自己產生位移)。
用偽代碼定義一下人這個類
人
{
//屬性有
姓名,
身高,
體重,
……
//方法有
吃(東西), //參數可以是不同的東西,獲得的能量也不同。
走(方向),
……
}
類的實例叫做對象,在程序中可以通過實例化這個類來描述一個人的屬性,比如這個人叫張三,身高180cm,80kg,三圍是xx、xx、xx等等。
比如我們做了一個游戲,那麼在新玩家創建角色的時候,就可以讓玩家選擇他角色的名字、外形等等參數,然後,用「人」這個類,實例化一個對象,然後在游戲中可以通過鍵盤或者滑鼠觸發走的動作。
8. 什麼是面向對象的編程方法
面向對象編程(Object Oriented Programming,OOP,面向對象程序設計)是一種計算機編程架構。OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。OOP 達到了軟體工程的三個主要目標:重用性、靈活性和擴展性。為了實現整體運算,每個對象都能夠接收信息、處理數據和向其它對象發送信息。
9. 什麼是面向對象編程
面相對象不是某一種語言的特性,而是一種編程思想。 C也是可以編寫出很好的OO代碼的,Gtk+就是典型的例子。
我們很多初學者往往一提到面相對象就一頭霧水,我覺得很大程度上都是因為我們學習的第一們語言是C,而struct總是在後面才講到,用C實現繼承技術需要一定技巧,一般的教材上都不講,加之我們剛開始遇到的學習程序有很小,很容易一個簡單的流程就處理完了這所有因素結合在一起,就導致我們用程序解決問題的思維有了 一個定式: 任務是什麼流程? 把流程切割成哪幾塊? 每塊定義成什麼函數?
等到我們所面臨的業務比較復雜了,原本線狀的流程圖也就變成一個可怕的網狀流程,我們根本找不到哪裡是開始,哪裡是結束,自然就無從下手
個人覺得,面向過程(或面向函數)的思維方式,其實就是程序員要把整個業務畫到一個流程圖中,因果關系,邏輯關系要搞得很清楚。你們回憶一下,你們在學習 C語言時,是不是很樂意在紙上或者腦子里畫這種流程圖來幫你們利清楚思路? 這種思維的最大問題在於,當這張流程圖變成一張流程網的時候,人的腦容量是不可能對之進行管理的,而且,維護程序的時候也必須同樣面對這張網,這對於維護代碼的同事而言,簡直就是一場災難。
最初,我們只想得到一根線來幫助我們貫穿始終,但後來這條線越來越長,又多了許多分支,於是變成了一張網;最終,網越來越密,等到我們無法繼續時,我們才發現,我們一直都在作繭自縛:)
下面,我舉個例子來說明面向過程和面向對象的一點區別。
假設在一段游戲的代碼中,有這樣一個場景:有1000噸的貨物,要從西安運到北京。
而面向對象(OO)的思維則會這樣思考:-
定義類(封裝性):
恩,這么復雜的送貨任務,總要有個人來做吧:) OK,是得搞個押運員去弄。 於是,要定義一個類:Escort。 稍後給它定義好新的方法:)-繼承:
這個押運員得是個人吧,應該有人的一切屬性(如眼耳鼻舌,受想行識),好吧,我不用重新實現這些,游戲中一般都有People的角色,從那裡繼承就好了, 於是,Escort 就成了People的子類,他可以享用People的一切屬性和方法這就是繼承。你不必為了Escort再重寫那麼多代碼,因為已經有寫好可用的了。 要知道,People中很多方法在Escort中都是用得到的。-定義方法:
好了,現在再分析一下Escort可能遇到的問題,以及他面對 問題所應具有的解決問題的能力就是他具有的方法。 山洪?地震?泥石流? 這些都是自然災害,沒辦法避免,OK,那就繞道而行吧! 得,第一個方法有了: Escort::choseWay()。 那麼,他怎麼知道哪裡有自然災害導致道路不通呢? 廢話!聽廣播,看電視撒! 哦,很好,我們的Escort是從People中繼承下來的,而這些方法我們都在People中實現了,這里已經沒有多少事情做了。-
現在我們假設有這樣一種情況:所有的人(People)都可能半路遇到兇殘的土匪,如果是你,你會怎麼做? 我想一般人都會跟我一樣:把錢給人家保命。 所以,People中處理土匪的方法會這么定義:{棄財保命}。 但是,作為一個Escort,你要是把貨物都丟了,這個Escort就失敗了,你們看看《闖關東》上的垛爺怎麼做的:爺們兒,碰了,這幾個錢個林子後面 的弟兄們買酒喝。所以,我們的Escort要重新實現處理土匪的方法,就是 { 按照道兒上的規矩,打手勢,棄小財而保全貨物 }。
現在,我們知道,所有的people都具有處理土匪的能力,但是不同的people對土匪的處理行為可能會不同。 再設想一下,某個山寨區域的代碼是由另外一個同事,甚至另外一個團隊編寫的,他們只知道他們的土匪面對的對象類型都是People,他們不知道 People還有沒有子類,還有多少子類等等。 幸運的是,OO的多態可以讓這些設計山寨區域的團隊不必考慮這些問題,他們只需要調用People的處理土匪方法,在運行時刻,
程序會自動根據實際傳入的對象來判斷最終要真正執行的方法。這種
調用同一基類介面,在運行時根據對象來執行相應對象類型中所定義的方法的行為就是多態
。 註: 這個定義是我自己給出的,如果您發現有不正確,請指出來,也方便我即使改正。 在很多C++教程中,多態的定義多為:多態是指父類指針調用子類方法。 我覺得這種說法欠妥,多態是很多OO語言的共性,比如python中沒有指針,但照樣有多態的功能。不過python是直接根據對象類型識別的,所以這個 概念在python的教材中淡出了。-
面向對象的擴展性:
相對於面向過程(函數)的編程思想,面向對象思想更易於編寫易擴展空間。比如上面的送貨的例子,這個游戲可能只是一個戰爭類游戲。後來,老闆為了刺激 消費,要把它像《虛擬人生》那樣的方向改進。具體一點,老闆希望游戲中可以有一些性方面的設計這個雖然不健康,但是在市場上卻往往很管用。這個時候, 你不必在每個人,每個分支上都添加關於性方面的代碼,你只需要給People類添加一個People::makeLove(People who)方法(參數的配偶對象)就OK了。至於which people, with who, where, when這些問題,留給那些處理具體場景的人去做就好了。-
面向對象與面向過程的聯系:
面向對象和面向過程不是水火不容的,對象中是有過程的。在編程工作中,你永遠無法避免對流程的處理,面向對象的思想只是給你提供了一種更合理的方式來你規 劃程序中的流程,如果你是一個team leader,或者總體設計師,這將更有利於你把任務分配給你的隊員。嘗試這用OO思維去認識身邊的事物,去規劃自己的程序,很快你就會轉入OOP的模 式,你會發現這種思路的確可以減輕大腦負荷。
10. 如何學習面向對象編程
盡管我們都是從OOP發展而來,事實上,真正的面向對象來自於OOD。沒有OOD的過程,就無法真正的面向對象。
書上那些小例子只不過是在展示「如何OOP」的手段,也就是在告訴大家「面向對象的語言有哪些特點」,而並沒有回答「什麼是面向對象」以及「為什麼要面向對象」。
事實上,這種小程序永遠也不能體現出「為什麼要面向對象」。面向對象與傳統的面向功能與面向數據的開發相比,最大的優勢在於業務邏輯的可重用性。傳統的開發最容易重用的是數據結構和底層代碼,而上面的調用代碼則很難重用,而面向對象則專注於如何另維護了業務邏輯的調用代碼更容易地被其它項目或是後繼項目使用。
同時,面向對象的開發也有利於提高可移植性。我前面說過,傳統的開發成果越是底層的代碼可重用性就越高,但如果牽涉到大量OS相關的內容時——比如GUI,則越是底層的調用就越難以移植,這就形成了一個矛盾。而面向對象的方法解決了調用代碼的可重用性,也就順帶提高了代碼的可移植性。