java 板


LINE

※ 引述《broodstare (交給C4就對了)》之銘言: : : 我想請問的觀念是: : : 在main裡,我將new Derived2()指派給了Base2 b,雖然原先class Base2裡的method : : foo 是設為private,但就多型來說,我應該也把Drived2的public method foo給了b : : ,理當b.foo()應該是可以執行的吧? : : (ps. 紅色的部份就是不能執行) : : 謝謝! : : -- :



※ 發信站: 批踢踢實業坊(ptt.cc)
: ◆ From: 140.115.110.189 : ※ 編輯: broodstare 來自: 140.115.110.189 (12/27 11:28) : → lovdkkkk:就多型來說, 是由 Base2 的觀點來看你要執行的 function 12/27 12:04 : → lovdkkkk:沒有把 Drived2 的方法給 b (反向繼承?) 這種事 @@ 12/27 12:05 : → jej:這幾個class的耦合性還是很高..不是學習泛型的好例子.. 12/27 12:37 : → jej:你的疑問 只要單純寫一個 new Base2() 然後看看能不能foo() 12/27 12:39 : → swpoker:要由上而下~而非由下而上 12/27 13:55 : : 謝謝各位版大們回答!! (很抱歉因為今天下午忙碌,沒法即時回應) : : 我想自己也有點混亂了,那我想再請問一些追加的相關問題: : : : Base2 b = new Derived2(); : : 就這個範例,是個好的寫法嗎? 是因為super-class Base2 與sub-class Derived2 : : 的method有所重疊(即便他們的modifier不同),導致這不是個很好例子? : : 所以要竟量避開這種寫法嗎? : : : 謝謝Q___Q : ※ 編輯: broodstare 來自: 140.115.5.114 (12/27 23:08) : 推 PsMonkey:B b = new D() 這沒啥問題,很多時候都是這樣用 12/28 00:33 我蠻好奇是什麼導致你衍生出你在追加問題所提到的看法。 假如 Base2 b = new Derived2();(包括 Base2 是個 interface 的例子)是個不好 的寫法而去避免,那麼你自己寫出來的碼"幾乎"不會有多型的應用。 許多教學都把 reflection(或是根本沒有 reflection)放在很後面,我自己覺得 要說明多型使用 reflection 其實會比較好一點(比較有說服力,我個人覺得)。 這種把所有東西寫在單一 source file 裡的例子,除了比較無法體會其涵義外, 有時覺得有誤導的成分在裡頭。 我來寫範例的話,大概會是這樣: 先寫一個 class(本來應該是 interface,為了比較接近你目前讀的範例,故寫成 class) MathOp.java ------------- public class MathOp { public double evaluate(double oprand1, double oprand2) { return oprand1 * oprand2 * 0; } } 編譯且確認得到 MathOp.class 接著寫這個 class: Computer.java --------------- public class Computer { public static double compute(MathOp op, double val1, double val2) { return op.evaluate(val1, val2); } public static void main(String[] args) { MathOp op = new MathOp(); if (args.length > 0) { try { op = MathOp.class.cast(Class.forName(args[0]).newInstance()); } catch (Exception e) { // I don't care why it fail } } System.out.println(compute(op, 8, 7)); } } 編譯並確認產出 Computer.class。 先執行看看 java Computer,輸出是 0.0,沒問題。 接著再寫以下兩個 class: Add.java ------------- public class Add extends MathOp { public double evaluate(double oprand1, double oprand2) { return oprand1 + oprand2; } } Multiply.java -------------- public class Multiply extends MathOp { public double evaluate(double oprand1, double oprand2) { return oprand1 * oprand2; } } 編譯 javac Add.java Multiply.java 得到 Add.class, Multiply.class。 你先想看看,你在寫 Add.java 與 Multiply.java 之前就已經寫好 Computer.java 並編譯成 Computer.class 且執行過,之後 Computer.java 與 Computer.class 檔案都沒有修改過。 現在你執行 java Computer Add java Computer Multiply 分別得到 15.0 56.0 甚至你可以回過頭來去編輯 MathOp.java 然後再編譯 MathOp.java(同樣不會改變 到 Computer.java/Computer.class): public class MathOp { public double evaluate(double oprand1, double oprand2) { return oprand1 * oprand1 + oprand2 * oprand2; } } java Computer 輸出 113.0 如果你看不懂 Computer.java 內的 main method 在搞什麼,你可以幫 Add.java 加上一個 main method: public class Add extends MathOp { public double evaluate(double oprand1, double oprand2) { return oprand1 + oprand2; } public static void main(String[] args) { System.out.println(Computer.compute(new Add(), 8, 7)); } } 編譯然後執行 java Add,得到輸出 15.0。 這整個例子的重點在於 Computer.java 在尚未有 Add/Multiply 這兩個 class 之前,在修改 MathOp.java 之前就已經編譯好(它的碼是固定),看起來是做固定 的一件事,但實際上它所做的事不是固定的,而是看實際上執行時他所拿到的 MathOp 是什麼而定。我認為這就是 polymorphism 的精神。 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 1.172.188.13 ※ 編輯: sbrhsieh 來自: 1.172.188.13 (12/28 02:45)
1F:→ gmoz:受教了 12/28 16:36
2F:→ lsc36:不過如果實際用途是這樣應該還是interface比較好吧 12/29 00:27







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP