作者adrianshum (Alien)
看板java
标题Re: [问题] 问一个新手问题
时间Fri Mar 28 10:26:33 2008
个人浅见
C++ 的 header 并不该与 Java 的 Interface 类比.
Java 的 Interface 是 OO (严格来说也不是, 算是
Interface-Oriented) 的 "Pattern" (不是 gof 的
design pattern). 而在 C++ 一样可以写成这样.
在 C++ 中, 写个 abstract class, 加上各类不同的
implementation, 是非常常见的做法.
Header 的功能旨在宣告, 令到compiler 在 compile
某 source 的时候知道它正在用的东西是会存在的,
待在 linking 的步骤真正把东西连结在一起时再检
查 "已宣告了的东西是不是都有真正的定义" (static
link 的情况), 或者把某些检查留待 runtime 检查
(dynamic link 的情况).
为什麽 Java 不需要这样做? 这是单纯因为 Java
的 classpath 及档案的安排做了一定程度的限制,
令到 compiler 能很简单就能找到 "宣告" (其实就
是直接从 package 对应的 directory 找, 档案就
是 class 的名字). 然後留在 JVM 在跑的时候去检
查定义是否存在. 有点像是每个 .class 就是一个小
型的 DLL.
孰优孰劣我不作评论, 反正在 C++ 一般来说都是采
用类似的 practice 作安排. 但可以肯定的是 Java 的
做法能强逼有一个好的档案结构, 对维护是有好处的,
开发时也因为少了档案 (一个 class 一个档案)而变
得简洁.
但相对而言, 因为不能只提供宣告给使用者, 所以
Java 更得使用 interface 把实作分离, 你可以说是
带动更清楚的设计, 但其实也少了 C++ 的某种弹性.
JavaDoc 也变成唯一的提供 API 与开发者的方法.
最後要说的是, Header 与是否 OO 一点关系都没有.
Java 也一样可以选择要 header 与 impl 分开档案放.
但这不影响语言上是否 OO. 有点类似 package 是不是
一定要跟 directory 才 OO 一样, 你可以说是 best
practice (只是 java enforce 了) 但与是否 OO 无关.
好长的一篇废话 :P
Alien
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.155.236.82
1F:推 linjack:解说清清楚楚推一下 03/28 10:45
2F:推 Fightsea:感谢您的解说!!! 03/28 12:10