作者brianhsu (坟墓)
看板java
标题Re: [问题] 继承与物件使用的问题?
时间Wed May 22 16:08:17 2013
※ 引述《brianhsu (坟墓)》之铭言:
: 我也要来赚 PO 文数……
: : public Class Main {
: : private Father obj;
: : private void function_A {
: : obj = new Child_A;
: : obj.string_A //这行认不到
: : }
: : private void function_B {
: : obj = new Child_B;
: : obj.arrayList_B //这行认不到
: : }
我又重新看了一次原 PO 的问题,发现漏了一个重点:
原 PO 你的 Father 到底有没有 ChildA 和 ChildB 都会用到的函式/变数?
如果没有的话,代表你这根本不是继承的问题,而是 disjoint data type 的问题,
也就是说你想让 obj 可以存『ChildA 或 ChildB』两种类型的物件,而 ChildA 和
ChildB 彼此根本没有任何关联。
这是可以做到,也是合理的,在 Functional Programming 里还常常用,例如一个函
式的回传值可能是「正常的结果或 Exception」,但这边的重点是「正常的结果」和
「Exception」本身就是两个风马牛不相及的东西,所以你总不会让你的「正常的结果」
的物件是继承自 Exception 类别吧?这种情况下一开始就不该用继承来解。
如果你是用 Java 的话可以用 Functional Java[1] 里面的 Either<A, B>[2] 这个类
别达到类似的目的。
写起来的程式码会看起来像下面一样:
class ClassA { public String strA = "A"; } // 注意两者没有任何继承关系
class ClassB { public String strB = "B"; }
public class Main {
Either<ClassA, ClassB> obj; // obj 是「ClassA 或 ClassB」
public void functionA() {
obj = Either.left(new ClassA)
obj.left().value().strA
}
public void functionA() {
obj = Either.right(new ClassB)
obj.right().value().strB
}
}
但相同的,在其他地方你最後还是要检查到底 obj 里是 ChildA 还是 ChildB,
你才能知道你到底可以做些什麽事情。
[1]:
http://functionaljava.org/
[2]:
http://0rz.tw/Z61U7
--
~
白马带着她一步步地回到中原。白马已经老了,只能慢慢地走,
'v'
Brian Hsu 但终是能回到中原的。江南有杨柳、桃花,有燕子、金鱼……
// \\
( 坟 墓 )
/( )\
但这个美丽的姑娘就像古高昌国人那样固执。 【白马啸西风】
^`~'^
http://bone.twbbs.org.tw/blog 『那都是很好很好的,可我偏不喜欢。』
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.109.19.84
※ 编辑: brianhsu 来自: 140.109.19.84 (05/22 16:14)
※ 编辑: brianhsu 来自: 140.109.19.84 (05/22 16:18)
1F:→ swpoker:哈~总算有人知道他的问题了~根本就不该用 "继承" 阿 05/22 16:28
※ 编辑: brianhsu 来自: 140.109.19.84 (05/22 16:39)
2F:→ swpoker:他不明白宣告跟物件的差异~以为通通都是物件 05/22 17:26
3F:→ henry4343:Father有共同的函式阿,文章中有讲只是程式码没打出来 05/22 17:40
4F:推 chchwy:共用函式该用聚合,不是继承。 05/22 23:05