精華區beta Programming 關於我們 聯絡資訊
> ==>發信人: gsj.bbs@bbs.nchu.edu.tw (國王的新衣), 信區: programming > ※ 引述《DungeonFan@kkcity.com.tw》之銘言: > > ※ 引述《gsj.bbs@bbs.nchu.edu.tw (國王的新衣)》之銘言: > > > 現實生活中,程序是程序,物件是物件 > > > 兩者是性質完全不同的東西 > > > OO如果只是模仿現實生活,那也要模仿得像一點 > > > 事實上OO的物件模型跟現實生活跟本就扯不上邊 > > 有阿 > > 動物->界門剛目科屬種-->老虎@@蜘蛛@@人@@ > 等你把存在於這個世界上的所有程式通通收集起來 > 搞個像 "四庫全書" 的東西 > 再加以分類,看是要分 "經史子集" ,還是 "界門綱目科屬種" > 這可是個萬世基業呀 用 界門綱目科屬種 或 經史子集 似乎把程設誤導到 "分類" 的工作了. 以上這種討論法, 看不出對任何一方會有甚麼幫助. 太高的抽象層次敘述對把 C 或 C++ 產生的組語會拿來看與想像的兩種語 言偏好者, 要溝通互助就只能談雙方都知道的認知部份. ============ 1. OO 的物件模型是 Abstract Data Type(ADT) 的延伸, 傳統 Procedure Oriented PL 也強調使用 ADT , 要是扯不上邊, 那就變成多數的傳統 Programming Model 也都跟現實生活扯不上邊. 2. OO 為了 code reuse 強調相近相關的擺一堆, 再找出抽象的共同部份. 其抽象的基型是 Basic Class , 衍生型 Class 可以繼承基型內的抽象 物件, 甚至在繼承後用 Virtual 重新宣告繼承的 function 要改為衍 生型 Class 下的同名 function , 以覆蓋超越原型的同名 function 的 作用, 這就像生物遺傳現象下的繼承與變異. 這是學 OO 者最津津樂道的特異功能. (其實是 POPL 沒這些術語, 有如 第一個看見飛機的非洲土人無以言狀, 就跟台語稱之為 "飛龍機", 是有 同樣的現象.) 3. 把相類似的功能寫成一個比較通用, 再透過參數區分差異, 形成一個可再 叫用的 procedure function 是 POPL 常用的 reuse 方法. 只是這種做 法若有變異與擴充, 就會讓這個 function 變得龐大較難維護. 4. 執行時, 將抽象的 Class 賦於實質的資料名稱空間(instance)才會形成 一個實體 Object , 不同的實體 object 有各自成堆適用的資料, 甚至是 繼承同一類 Basic Class 的特性, 但卻隨資料空間名稱的不同有所差異, 這些不同名 Object 彼此在封裝概念上是隔離的. 但不同實體名稱空間的 實體 Object 如果來自用套 Class Object , 其 function method 在封裝 概念上是如同複製一份 function code 在實體 Object 內再用, 但在單機 上, Object 內的 function code 是可以共用同一份的(類似一個 ROM code 透過 address pointer 使用多份的 USER RAM SPACE 就形成多份 的 可併行的 USER Program 這種用法). 因此在單機上就逼近 POPL 對 procedure 因不同資料情況下的分別反覆叫用. 5. 較不同的是 OOPL 接近這種已知 procedure name 且可立即找到使用下的 動態連結(Dynamic Linking), 但 POPL 的 procedure 在傳統上是靜態的 預先連結(Static Linking), 因此, OO 在拆解替換的維護擴充上就是較具 彈性. 封裝概念下使用動態性資料記憶體配置, 對實體 Object 內的 data 與 function method 的實際位址就會較不易掌控, 但這就是封裝的目的之 一, 也是 C++ 一個潛在的比較難用之處. OOPL(如 C++) 在 Programming 技術上, 可說就是把程式的再用性制式化, 是 把這種制式化的再用性崁入語言的使用習慣上. 這種再用不是相同性的複製, 所以講究要能有繼承, 多態這種變化與方便. 至於封裝隔離帶來實體 Object 的併行性, 那就需要進一步有需求下才會有這 種認知. -- ◎ Origin: 中央松濤站□bbs.csie.ncu.edu.tw From: 140.115.6.234