1 / 57

OOP Class vs. Object

OOP Class vs. Object. 建國科技大學資管系 饒瑞佶 2012/9. 類別與物件. Class= 類別 Object= 物件 物件導向程式 ( OOP , O bject O riented P rogram) 的核心人物 一切都是為了 讓電腦能模擬出更接近事實的東西來解決需求. 傳統電腦語言. 程序導向 (procedure-oriented) 為主,也就是一系列命令構成一個系統或功能 強調資料管理 ( 資料庫 ) ,面對流程或規則變化時幾乎要大改 可以用的東西 ( 變數、方法 ) 固定、有限、 擴充與更改困難 最糟的是 跟事實不太接近.

Télécharger la présentation

OOP Class vs. Object

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. OOPClass vs. Object 建國科技大學資管系 饒瑞佶 2012/9

  2. 類別與物件 • Class=類別 • Object=物件 • 物件導向程式(OOP,Object Oriented Program)的核心人物 • 一切都是為了讓電腦能模擬出更接近事實的東西來解決需求

  3. 傳統電腦語言 • 程序導向 (procedure-oriented) 為主,也就是一系列命令構成一個系統或功能 • 強調資料管理(資料庫),面對流程或規則變化時幾乎要大改 • 可以用的東西(變數、方法)固定、有限、擴充與更改困難 • 最糟的是跟事實不太接近

  4. 程序 vs. OOP 程序1 程序2 程序4 開始 程序3 結束 物件2 物件1 開始 結束 訊息 物件3

  5. 什麼是事實呢? • 例如我要寫一個學生點名系統 • 使用這個系統的當然有學生、老師、教務處人員 • 系統最重要的功能當然是點名 • 當然要把點名資料儲存起來 傳統標準做法:利用資料庫儲存資料,寫程式(程序導向)處理點名與儲存 強調流程圖與邏輯

  6. 這樣做好不好呢? • 這樣做是對的! • 但是 • 對於現實世界描述不佳 • 不利於程式碼重用(reuse),雖然可以寫成dll或是副程式,但後續要修改就很麻煩 • 無法站在巨人肩膀上延伸,所以無法縮短系統開發時程

  7. 對於現實世界描述不佳 • 以學生為例 • 學生有基本屬性,例如姓名、身高、學號等 • 學生有行為,例如刷卡、查出勤記錄等 • 電腦怎麼模擬這樣的世界呢? • 傳統的程序導向語言是很難做到的,或是說要聯想(包)在一起很難

  8. 無法站在巨人肩膀上延伸 • 別人做過的幹嘛再做一次(reuse) • 寫成副程式不就好了,問題是要修改擴充時怎麼辦? • 所以讓程式開發成效與效率不彰 軟體工程所要探討!

  9. 抽象化abstraction • 為了更接近事實,電腦採用模擬的方式,所以要將現實的東西抽象化 • 抽象化就是把現實的實物轉換對應(mapping)到電腦可以處理的東西 • 這個東西就是「class(類別)」與「object(物件)」 為什麼抽象呢?因為你不可能100%對應

  10. 先談談類別 • 事實: • 學生有基本屬性(資料),例如姓名、身高、學號等 • 學生有行為(功能、動作),例如刷卡、查出勤記錄等 • 特性: • 學生是一個大類,每個學生都有姓名可是每個都不同(同一類但個別有差異) Class Object

  11. 如何把學生抽象化呢? • 既然同一類,那就弄個類別來定義它吧,所以CLASS(有些稱type)就誕生了 • CLASS內有: • 學生基本屬性,OOP稱為「data member(資料成員)」 • 學生有行為, OOP稱為「member function(成員函數)」 不是只有現實世界的實體可以抽象化 動作交易等也可以抽象化

  12. 轉換對應(mapping) 現實 電腦 學生 Class學生 { 姓名 身高 學號 會刷卡 會查詢資料 會修改資料 } 姓名、身高、學號… 抽象化 資料成員 刷卡點名 查詢資料 修改個人資料… 非100% 成員函數

  13. 怎麼處理個別差異? • 學生是一個大類,每個學生都有姓名可是每個都不同(同一類但個別有差異) • 這時候「Object(物件)」就出現了 • OOP把從class變成物件這個過程稱為instance(實體化) • 幾乎每本OOP書都會講的範例,CLASS就像建築藍圖,只有一份,但是可以蓋出(instance)很多房子(object),每個房子外牆顏色可以不同(個別差異) • 真正可以用的是OBJECT(房子),而不是CLASS(藍圖),程式內也是一樣

  14. instance Object Class學生 { 姓名 身高 學號 會刷卡 會查詢資料 會修改資料 } instance

  15. 再看看Class 公開 整個被包起來 (資料與動作在一起了) Encapsulation (封裝) public 資料 不公開 private 資料 public 函數 介面 interface private 函數 別的class • 資料不想被人看到或不是每個人都可以處理,封裝(Encapsulation) public private protected(修飾詞modifier)…

  16. 怎麼reuse與擴充?繼承出現 學生 class 姓名 選課 Inheritance 繼承 非洲學生 class 亞洲學生 class 姓名 選課 上軍訓課 姓名 選課 打仗 完全繼承「學生class」的所有東西 表示亞洲學生擁有學生的特性,但是可以再加入亞洲學生特有的東西

  17. 小結 • 用Class來模擬現實世界 • Class裡面有資料與方法(稱為iterface) • Class是可以開放或被封起來的 • Class可以透過繼承,不斷擴充 • 有class沒用,需要利用class產生出物件才能有實際作為

  18. 再往下想 • 為了進一步解決前面說的reuse等問題… • 會再看到… • Overriding(覆寫) • Composition(複合) • Polymorphism(多形) • Interface(介面) • Overloading(超載) • … 一門物件導向程式設計的課

  19. 畫個圖好了 Class 1 A B Class 3 改寫A inheritance inheritance overriding Class 2 A C(參數) C Class 輪胎 D E Class 車燈 Class 4 組合兩個CLASS Composition 兩個C overloading Class 車 有了這個就可以在程式內打造車子與操縱車子

  20. 看個範例 Class 交通工具 move inheritance Class 汽車 Class 腳踏車 move 走二高 move 走小巷 Polymorphism(多形) 一個move有多種表現 Overriding move

  21. 再看更多 好像可以不要定義? Class 交通工具 move inheritance 這裡再給實際定義就好! Class 汽車 Class 腳踏車 move 走二高 move 走小巷 overriding Class交通工具的move不需要任何資料成員或函數成員 Class交通工具可以不用被實做 真正的資料成員或函數成員都放到繼承class上

  22. Class交通工具的move不需要有實際定義 • 真正的資料成員或函數成員都放到繼承的class(汽車或腳踏車)上 • 這就是overriding,讓各自繼承類別擁有差異性 • 可以使用interface關鍵字,強制Class交通工具的move不需要實際定義 • 好像Class交通工具也沒有instance的必要 • 可以用abstract關鍵字,讓Class交通工具無法被instance(new)成object 對電腦來說就是實際配置了記憶體

  23. 為何只要有宣告,沒有實質定義? • 大家後面用的都是同一個名稱,講的話一樣,避免意義相同,但名稱大亂 • 上層只管要功能,下面各自怎麼做則是擁有彈性與擴充性

  24. 特性! • 當我加入一個新的class 機車時,我只要繼承class交通工具,然後專心寫機車的move就可以(reuse+擴充) • 不需要去修改原程式架構,也就是不會因為加了一個新的class進來而去動到原來存在的程式架構(例如名稱或動作方式) • 這對程式碼的擴充與維護非常重要

  25. 告訴電腦有這個可以用 我已經定義好了 要不要用,你自己選擇 我決定要用這個類別 所以我用new產生物件 電腦就幫我配置出記憶體 class object new

  26. 思考沉澱一下!

  27. 程式寫法 • 如果前面都沒問題了 • 那就是用一個支援OOP做法的程式來寫程式就是了 • 有能力做OOP的,JAVA是佼佼者,所以Google選了它 紅字是 寫程式會看到的關鍵字 Class class Instance  new Inheritance  extends ….

  28. 程式語法與觀念對應 當然還有更多…

  29. Java • OOP程式語言 • 大小寫有別 • 需要;結尾 • 區段都是用{} 包圍 • 都是CLASS組成,透過PACKAGE管理 • 需要一個且只能一個main的進入點(程式起始執行點,但Android不是用main) • Android用的Java大致上沒有差很多

  30. 做個範例試試 執行程式 Class SuperCar 呼叫 wash wash是大家共有 Class rider move wash callwash inheritance Class Car1 Class Car2 move move(參數) overriding

  31. 請大家專注在結構與觀念上不要在意語法為何這樣寫請大家專注在結構與觀念上不要在意語法為何這樣寫

  32. 做個範例試試 Eclipse不是專屬於Android!

  33. 先建立類別rider 執行程式 • 類別名稱:rider • 有一個成員函數:callwash • 是程式的進入點 Class rider callwash

  34. package名稱 CLASS名稱 CLASS型態關鍵字 被繼承(上層)CLASS 是否有程式進入點

  35. rider.java JAVA程式進入點 Android不是用main!

  36. 寫一行程式來執行看看 為何這樣寫? 查書就有了 遭遇戰…

  37. 再來建立類別SuperCar Class SuperCar • 類別名稱:SuperCar • 設定為不可以instance(abstract) • 有兩個成員函數:move與wash • 不實際定義move(abstract) move wash

  38. 限定不可以instance SuperCar.java 沒有實際定義

  39. 再來建立類別Car1 • 類別名稱:Car1 • 繼承:SuperCar(extends) • 有一個成員函數:move • move要overriding Class Car1 move

  40. Car1.java 繼承 overriding

  41. 再來建立類別Car2 • 類別名稱:Car2 • 繼承:SuperCar • 有一個成員函數:move • move要overriding • move有參數 Class Car2 Move(參數)

  42. Car2.java 繼承 overriding 如果我再加一個move overloading

  43. 到這裡定義完成所有的class但不會動,因為沒有object到這裡定義完成所有的class但不會動,因為沒有object

  44. 先instance Car1 實做Car1 物件是objCar1 透過物件才能呼叫成員函數

  45. 擴大到Car2

  46. 最後呼叫共有的成員函數wash完整rider.java 實做Car1 物件是objCar1 實做Car2 物件是objCar2 物件才能呼叫成員函數 呼叫大家共有的

  47. 執行結果

  48. 再定義一個interface 不實際定義 只有宣告

  49. 讓Car1再繼承或延伸使用skywindow 自然會要求你要實際定義washwindow

More Related