[討論] protocol 與 java 的 interface

看板MacDev作者 (吹笛牧童)時間11年前 (2014/02/14 16:08), 編輯推噓2(2014)
留言16則, 2人參與, 最新討論串1/2 (看更多)
學 java 時,學到 interface 這東西取代了 C 的函式指標 同事在用了後覺得不錯 反而在 C++,再也不用函式指標了 大量的使用 interface 說真的一開始給我帶來很大的門檻 但等我也學 Java,被逼著學會後 的確覺得這樣的架構還挺美妙的~ 怎麼說呢... 嗯,我一次用一整組函式指標組成的 interface 而不是一個一個指標去註冊 這樣在多個函式具有一種架構時,更可以看出它們的關係 VC 的 interface 其實就和 class 一樣 只是 RD 要有自律,不要在 base class 去 implement 裏面的函式 保留起來做純虛擬 class, 那就是 interface 了 VC 支援多重繼承, Java 不支援;但 Java 可以"繼承" interface 在我看來就是這樣,所以 繼承 兩字我要打引號 也許有人會說是 implement 吧.. 到了 Object C, 看到 protocol 看來看去它就和 java 的 interface 一樣嘛 (如果要說不一樣,那我就學不會它了) 可是它的檢查好鬆喔.. 1.我宣告我的 class 使用某 protocol 然後不實作它 Compile OK!! 2.我不宣告我的 class 使用某 protocol,但我實作它 然後在某個要求傳入實作 protocol 物件的場合,把我這個 class 物件傳進去 Compile 也 OK!! Holy 謝~ 你給我這樣在 C++ or Java 玩玩看 Compiler 一定不會饒過你的 結果 Object C 把這輕輕放下了 至此,我只好這樣去理解了: protocol, 是提高可讀性而已啊,讓你知道 "這裏有個規矩可以遵守" 其實你就把它當個 base class 看就好 你要不要在你的 class 裏,打個 < > 符號,把 protocol 寫在裏面宣告 宣告後要不要實作 都隨便你了啊~~ -- 活動/美食計劃 蘭嶼 魚白 勝興車站 星月天空 武陵 草嶺古道 嘉義阿里山小火車 保齡球  司馬庫斯 手包水餃 日月潭纜車 合歡攻頂 馬祖 鹽山 南庄 澎湖 溪頭/松林町 南投天梯 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.251.197.63

02/14 16:28, , 1F
Protocal定義裡面可以指定一定要實作哪些method
02/14 16:28, 1F

02/14 16:29, , 2F
然後,Obj-C的精神是message傳遞,每個所謂的 method 呼
02/14 16:29, 2F

02/14 16:30, , 3F
叫,都是呼叫一個固定的function(底層的C實作),參數帶
02/14 16:30, 3F

02/14 16:30, , 4F
你要呼叫的"method特徵",所以只要被呼叫的object有對應
02/14 16:30, 4F

02/14 16:31, , 5F
的method特徵實作,就會被叫出來執行
02/14 16:31, 5F

02/14 16:32, , 6F
基本上,你要理解Obj-C的設計,你需要先知道,Obj-C設計
02/14 16:32, 6F

02/14 16:32, , 7F
的時候"沒有C++,沒有Java,它是純C去做出物件的行為"
02/14 16:32, 7F
你是說, Obj-C 在設計的時候, C++ 還沒發明出來是嗎? 因為這句也可以理解成 "沒有使用 C++" 但 C++ 可以用前置處理器做掉,然後 .cpp 就變 .c, 再交由標準 C compiler 去跑 所以如果不是 "C++ 還沒發明出來", 而是 "沒有使用 C++" 那我就無法理解了

02/14 16:33, , 8F
然後就比較能體會為什麼要這樣設計
02/14 16:33, 8F
如果是"當時還沒有 C++", 那我就懂為何它要自稱 Object 語言了 XD 因為 C++ 也是 Object 語言 就好像一家在濁水溪的米取名叫濁水溪米,但明明其他很多米也是濁水溪米 那我會覺得"你怎麼把大家的名字拿去註冊了啊,根本先講先贏嘛" --- 那有個效率上的問題,在 wiki 上我竟查到,它用訊息效率也不差.. 啊?怎麼做到的 C++ 的做法其實只是語法符號 基本上 class 可以用 struct 取代 function pointer 在 C 時代早就有了 只要在 strcut 內擺入 fp struct 就可以運作得和 class 一樣 當然, private, public 等等權限檢查,那是沒有了 可以說 C++ compiler 帶來的'必要性差異',就在權限檢查 所以 C++ 置換成 C,是絕對可行;而且有一個很標準的模型 Obj-C 的 head file 可以分兩三處各別宣告 XDDD 所謂 category,老實說這是我從前的夢想 我一直想要臨時增加一些宣告,但不要給其他 .c/cpp 檔看到 繼承到不同的子類別再各別寫? 但所有功能在 class 內都要有 private 引用的能力 可以說全都該寫到 base class 內 然後再依不同狀況 public 出去 可是子類別都必需 include 父類別,而 .h 就會公開 雖然 obj 可以不公開,但也被看到很多了 category 似乎可以解決這個問題(我還沒很清楚) 其實以前看過 C# 簡介(但我沒學),好像就有這個能力 .h 可以拆開到幾個地方 用 message 是可以理解了,那當然做得到 但程式又怎麼快得起來 :P messge 怎麼找得到 code 來執行 目前我的理解是像微軟的 DLL, 動態的東西就是要這樣,甚至函式都有保留完整 symbol 然後才可以去做字串比對,找出來執行 字串比對,就不快啦~ 但如果它不想快,只想當高階語言 (反正電腦會愈來愈快) 那就很容易理解了 ※ 編輯: HuangJC 來自: 60.251.197.63 (02/14 16:51)

02/14 20:28, , 9F
class有一個method_list 會根據你傳入的SEL做比較
02/14 20:28, 9F

02/14 20:30, , 10F
SEL就你的方法名 它是用一個優化過的hash table 的set
02/14 20:30, 10F

02/14 20:31, , 11F
所以找到class的SEL後再根據你IMP的位置去找
02/14 20:31, 11F

02/14 20:36, , 12F
我記得這個set有原本系統dyld給你創的cache set,讓你能
02/14 20:36, 12F

02/14 20:37, , 13F
讓你優先查找系統你導入framework的method 和決定是否需要
02/14 20:37, 13F

02/14 20:38, , 14F
括展你自己加入方法的method_list
02/14 20:38, 14F

02/15 01:06, , 15F
你去查一下程式語言的發展史,不就知道ObjC是"不用C++"
02/15 01:06, 15F

02/15 01:06, , 16F
(老實說我不是很確定這句話是啥意思)還是"沒得用C++"了?
02/15 01:06, 16F
> 貝爾實驗室的比雅尼·斯特勞斯特魯普博士在20世紀80年代發明並實現了C++ > 1980年代初,Stepstone 公司的 Brad Cox 與 Tom Love 發明了 Objective-C from wiki 要更考古才知道答案,不然我以為 1980 就是80年代,差不多差不多 要是說"戰",那是了,兩派工程師不知會不會吵起來 其實我不是要選擇;吃人頭路我已經沒有選擇了(可以只憑 C++ 寫出來嗎?) 而是去搞懂它的差異,也比較能運用它 話說回來,我買了一本 Object C 的書,應該是專教語言才對 結果它還是一直提 Mac,好像除了它沒人在用似的 難道市場說明了.. 咳咳 ※ 編輯: HuangJC 來自: 60.251.197.63 (02/15 01:28)
文章代碼(AID): #1I_SxljC (MacDev)
討論串 (同標題文章)
文章代碼(AID): #1I_SxljC (MacDev)