[討論] protocol 與 java 的 interface

作者: HuangJC (吹笛牧童)   2014-02-14 16:08:12
學 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 寫在裏面宣告
宣告後要不要實作
都隨便你了啊~~
作者: Blueshiva (龍野南雲)   2014-02-14 16:28:00
Protocal定義裡面可以指定一定要實作哪些method然後,Obj-C的精神是message傳遞,每個所謂的 method 呼叫,都是呼叫一個固定的function(底層的C實作),參數帶你要呼叫的"method特徵",所以只要被呼叫的object有對應的method特徵實作,就會被叫出來執行基本上,你要理解Obj-C的設計,你需要先知道,Obj-C設計的時候"沒有C++,沒有Java,它是純C去做出物件的行為"然後就比較能體會為什麼要這樣設計
作者: yuanruo (罪を憎んで人を憎まず)   2014-02-14 20:28:00
class有一個method_list 會根據你傳入的SEL做比較SEL就你的方法名 它是用一個優化過的hash table 的set所以找到class的SEL後再根據你IMP的位置去找我記得這個set有原本系統dyld給你創的cache set,讓你能讓你優先查找系統你導入framework的method 和決定是否需要括展你自己加入方法的method_list
作者: Blueshiva (龍野南雲)   2014-02-15 01:06:00
你去查一下程式語言的發展史,不就知道ObjC是"不用C++"(老實說我不是很確定這句話是啥意思)還是"沒得用C++"了?

Links booklink

Contact Us: admin [ a t ] ucptt.com