作者HuangJC (吹笛牧童)
看板MacDev
标题[讨论] protocol 与 java 的 interface
时间Fri Feb 14 16:08:12 2014
学 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
1F:推 Blueshiva:Protocal定义里面可以指定一定要实作哪些method 02/14 16:28
2F:→ Blueshiva:然後,Obj-C的精神是message传递,每个所谓的 method 呼 02/14 16:29
3F:→ Blueshiva:叫,都是呼叫一个固定的function(底层的C实作),参数带 02/14 16:30
4F:→ Blueshiva:你要呼叫的"method特徵",所以只要被呼叫的object有对应 02/14 16:30
5F:→ Blueshiva:的method特徵实作,就会被叫出来执行 02/14 16:31
6F:→ Blueshiva:基本上,你要理解Obj-C的设计,你需要先知道,Obj-C设计 02/14 16:32
7F:→ Blueshiva:的时候"没有C++,没有Java,它是纯C去做出物件的行为" 02/14 16:32
你是说, Obj-C 在设计的时候, C++ 还没发明出来是吗?
因为这句也可以理解成 "没有使用 C++"
但 C++ 可以用前置处理器做掉,然後 .cpp 就变 .c, 再交由标准 C compiler 去跑
所以如果不是 "C++ 还没发明出来", 而是 "没有使用 C++"
那我就无法理解了
8F:→ Blueshiva:然後就比较能体会为什麽要这样设计 02/14 16:33
如果是"当时还没有 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)
9F:→ yuanruo:class有一个method_list 会根据你传入的SEL做比较 02/14 20:28
10F:→ yuanruo:SEL就你的方法名 它是用一个优化过的hash table 的set 02/14 20:30
11F:→ yuanruo:所以找到class的SEL後再根据你IMP的位置去找 02/14 20:31
12F:→ yuanruo:我记得这个set有原本系统dyld给你创的cache set,让你能 02/14 20:36
13F:→ yuanruo:让你优先查找系统你导入framework的method 和决定是否需要 02/14 20:37
14F:→ yuanruo:括展你自己加入方法的method_list 02/14 20:38
15F:推 Blueshiva:你去查一下程式语言的发展史,不就知道ObjC是"不用C++" 02/15 01:06
16F:→ Blueshiva:(老实说我不是很确定这句话是啥意思)还是"没得用C++"了? 02/15 01:06
> 贝尔实验室的比雅尼·斯特劳斯特鲁普博士在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)