作者adrianshum (Alien)
看板java
标题Re: [问题] 继承与物件使用的问题?
时间Wed May 22 06:39:20 2013
有些观念需要搞清楚。
你做的东西涉及两个观念:继承和多型
这里说的继承不是指 Java 里的 extend, 而是一个观念。
你说的没错,把共同的东西放在 Father,然後 ChildA ChildB
extends Father 时候,就会把那些共有的部份继承下来,那麽
共有的部份就不必在每个 child 重新打造。直到这部份还是对
的。
可是 Java 的 extends 还涉及另一个观念,就是多型。所谓多
型指的是一个 obj 能以不同面貌示人,比如 ChildA 就能以
Father 的面貌示人,用的人只要当它是一个 Father 就行。可
是问题就在於,当别人当它是 Father 使用,他就只能 "当成
Father" 去使用。
你的例子里面,
Father o = ......; // 这里不要理会指向什麽
o.childASpecificMethod(); // 这里出问题
你要当成一个 Father 使用,就真的只能用 Father 里的东西,
因为在 compile 时,compiler 不会知道 o 会不会指向任何其
他 child 类,万一o 指向一个 ChildB 怎麽办?(qrtt1 站友
提到的 duck typing 是某些语言的解决方法,但 Java 并不用
这种做法)
简单来说:
你要是想把 Child 当成 Father 操作,你就只能用操作 Father
的方式去操作它,想用到 ChildA 独特的方法去操作,就就得把
它当成 ChildA。
说有违你本身的想法,那大概因为你没搞清你的想法。你单纯
是想把共有的东西继承到 child? (你做到了)还是想把 child
能当成 father 去操作?(那就涉及在 Father 的API 要把这些
操作方式以 "对Father 而言有意义" 的方法 expose 出来了,
这部份你则完全没在做,偏偏 Father o=..; o.doSomething;
就是在体现这部份)。
Alien
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 223.19.42.175
※ 编辑: adrianshum 来自: 223.19.42.175 (05/22 06:40)
1F:推 PsMonkey:为甚麽看到这篇直觉想接「阿星,接力接力!」 XD 05/22 08:05
2F:→ swpoker:有些语言没有宣告这种东西 只有参考命名!!! 05/22 11:47