※ 引述《gsj.bbs@bbs.nchu.edu.tw (國王的新衣)》之銘言:
> ※ 引述《yoco.bbs@bbs.wretch.cc (眠月..)》之銘言:
> > 事實上,OO 的理念就是希望「讓你(選擇)可以不用知道內部實際作業」,
> 如果是這樣的話,OO中的 "繼承" 機制本身就成了一個自我矛盾的東西
> 對於既有物件作 "繼承" 的動作,多少都有 "修改" 現行物件的意味在內
> 但卻看不到原始的物件內部的狀況
這也是繼承被發明出來的原因之一,
因為有時候會拿到第三方的 libraries,
但是只有 binary + text header files,
這時候就可以依靠繼承解決,
而且又拜 class 把 data 和 code 綁在一起所賜,
你不會把不適當的 code 施加在不適當的 data 上,
在 C 的話,header 檔要是又少了註解,可就沒這麼幸運。
另外,繼承的主要目的在於重複使用寫好的東西,
所以並不是要你把箱子拆開來看,拆開來改,
而是把小箱子裝進大的箱子,
然後在中間的空間裡塞一些其它的東西。
正因為如此,你只要知道小箱子提供給外部的介面就夠了,
換句話說你只需要理會標示為 protected 和 public 的部分,
標為 private 的,從根本上你就不應該浪費時間去理會他。
> 於是這個機制就成了,在修改一個我不完全了解的程式(或者是黑箱)
> 就像是在拆一個自己不是很了解的炸彈一樣
> 你說這樣安不安全
也沒有你想的糟糕...
首先還是要強調一點,繼承不是要你拆,是要你拿來用,
所以小箱子標示為 private 的部分你不必動也不能動。
接下來就是看看標為 protected 的介面有哪些,
這通常都是小箱子的設計人為了大箱子的設計者而特別放出來的,
一般而言設計大箱子的人可能會呼叫這些 protected methods,
將這些 protected method 互相組合,
和小箱子的內部溝通,以設計出更好的功能。
public 通常是小箱子想放給外界使用的介面,
大多數的情形下你也會想提供相同形式的介面出去,
通常標為 public 的東西就是給外面亂戳亂玩也不會爆炸的,
如果你覺得小箱子有某些 public 的東西危險,
你還是可以把它 private 化,
或是標成 protected,
只給將來設計更大箱子的人使用。
和 protected 相同的是,
你也能組合小箱子的 public methods 提供功能更強大的介面。
另外,如果你看小箱子的某些介面不順眼,
你還可以覆寫(override)它,
把不順眼的地方給遮起來,
把那個部分整個重新設計一遍。
對於設計小箱子方面經驗很老到的人來說,
用他們設計出來的小箱子是非常安全的,
除非你用的是經驗很淺的人寫的小箱子,
不然就是故意要放炸彈炸死你的仇家寫的。
而經驗老不老到跟語言機制本身安全性的影響性,
在每個語言都一樣,
在 C 的時代人家嫌 pointer 不安全,
但是給經驗老到的人來寫照樣又快又安全,
程式彈性又大;
C 不會檢查 array index out of bound 的問題,
經驗老到的 C programmer 反而將它視為優勢加以發揮和應用,
但是在寫 Java 的 programmer 就不這麼想。
所以,討論安不安全實在沒有太大意義,
因為這就如同討論 pointer 的存在以及不檢查 array 邊界安不安全一樣。
--
Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net
School: National Chung Cheng University
Department: Computer Science and Information Engineering
Researching: Porting GCC and Implementing VLIW instruction scheduler in GCC
Homepage: https://it.muds.net/~uranus
--
╔═══╗ ┼────────────────────────╮
║狂狷 ║ │* Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮
║ 年少║ ┼╮ < IP:140.119.164.16 > ╰─╮
╚╦═╦╝ ╰ * From:218-171-143-156.dynamic.hinet.net
─╨─╨─ KGBBS ─ ◎ 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩 ◎
--
* Modify: tinlans 05/08/13 9:24:00 <218-171-143-156.dynamic.hinet.net>