→ ssccg: new phone()就是new了一個phone,怎麼會是downcast 08/11 10:29
→ ssccg: 除非你還有其他種phone,不然一直用android不就好了 08/11 10:32
→ ssccg: android就繼承了phone了,可以run()啊 08/11 10:34
ring 就掛啦
→ swpoker: 父不父,子不子,怎麼看都亂倫阿 08/11 10:43
可以嚴肅點嗎,不要喧鬧好嗎
聽無
→ realmeat: 推亂倫 XD 08/11 10:55
→ swpoker: 父 物件=new 子() 08/11 11:38
→ swpoker: phone沒有ring嗎?我覺得OO的很怪阿?繼承或動態都不是 08/11 11:42
→ swpoker: 乾脆你用annotation好了 08/11 11:42
因為父沒有實作ring 甚至根本沒有ring,所以phone沒有ring 很合理阿!
我再說明一次, 可能我沒有表達清楚
我要繼承某Class, 並且替他增加Method,
在OO上這作法很合理, 但實際運用時又會碰上CastException,
我真的不懂...所以誠心發問
→ ssccg: 你全程變數類型都用android有問題? android有ring怎麼會掛 08/11 13:00
→ ssccg: 原本需要phone的地方直接傳android object進去也不用cast 08/11 13:00
→ ssccg: android is phone, phone is not android 08/11 13:00
→ ssccg: cast只是轉reference型態,object new的時候是什麼就是什麼 08/11 13:01
是這樣的..
我用org.jsoup 這個framework ,用jsoup來Parse Html File, 也就是把html轉object
如何轉換呢?
org.jsoup.nodes.Document doc = jsoup.parse(file.getPath());
所以我得到一個 doc Object, 裡面有html File全部的tag Object
我想要幫 Document 增加新的Method, 叫做 newM
所以 new Paper() extends Document, Paper裡面有 newM
如果我把
org.jsoup.nodes.Document doc = jsoup.parse(file.getPath());
那行改成
Paper paper = (Paper)jsoup.parse(file.getPath());
肯定castException
PS:jsoup.parse只會rerten Document
如果我改成
Document paper = new Paprt(file.getPath());
paper = Jsoup.parse((file.getPath());
Element hardDiv = paper.hade();
都沒問題
但是一旦呼叫newM, 就像這樣
((Paper)paper).newM();
castException 就會在RunTime時跑出來
我知道如果把 Document 放在Paper class 當成member,不要用extend, 就萬事OK
但是我就是想用extend, 該怎麼辦呢?
※ 編輯: pttnews (49.217.82.145), 08/11/2015 13:43:05
推 ckvir: 應該要這樣吧 08/11 14:36
→ ckvir: Doc d = new Paper() 08/11 14:36
→ ckvir: d = jsoup. parse(... ) 08/11 14:36
→ ckvir: Paper p = (Paper) d 08/11 14:36
→ ckvir: p. newM() 08/11 14:36
我試了 結果...
Paper p = (Paper) d; 這行castException
推 cowbaying: 要不要弄個介面去繼承phone 然後再實作ring? 08/11 16:00
可是瑞凡 interface 不能繼承 phone, 我也不能做一個interface 讓 doc implements
這等於去改別人的framework阿...
※ 編輯: pttnews (49.217.82.145), 08/11/2015 16:28:00
→ ssccg: 回傳回來的就是Document不是Paper,只能寫個東西去轉換 08/11 17:02
→ ssccg: Paper p = new Paper(doc),然後自己把field copy過去 08/11 17:08
您說的沒錯,工很大,謝謝你,好像目前也只能這麼做了
→ ssccg: 通常是把Paper做成wrapper(你說的doc當成member) 08/11 17:38
→ ssccg: 但是一定要維持type是Document的話工也滿大的 08/11 17:38
※ 編輯: pttnews (49.217.82.145), 08/11/2015 17:57:01
→ qrtt1: 別傻的 copy 啊,IDE 有 generate delegate methods 啊 08/11 17:57
→ ssccg: 看了一下jsoup source,parse可以傳Parse進去,Parse是用 08/11 18:25
→ ssccg: TreeBuilder,然後Document是在initialiseParse new的 08/11 18:26
→ ssccg: 也可以subclass TreeBuilder把doc的type換掉再拿來用 08/11 18:27
HtmlTreeBuilder 的 constructor is not public
只要new 或是 subclass 都會遇到
The constructor HtmlTreeBuilder() is not visible
謝謝你~我學到很多
※ 編輯: pttnews (220.135.143.146), 08/11/2015 22:07:31
→ ssccg: 也不是private,真的要做的話放到同一個package下就可 08/12 14:43
→ swpoker: (BXX)((Object)a) 08/13 10:27