Re: [問題] 多繼承super的問題

看板java作者 (口德是一種美德)時間10年前 (2014/12/19 18:53), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串2/3 (看更多)
※ 引述《egheee (阿平)》之銘言: : 標題: [問題] 多繼承super的問題 : 時間: Fri Dec 19 12:15:54 2014 : : class A { : : void tell() { : Log.e("", "I am a"); : } : } : : class B extends A{ : : void tell() { : Log.e("", "I am b"); : } : } : : class C extends B { : : void tell() { : super.super.tell(); // 問題 : Log.e("", "I am c"); : } : } : : 如上列所示,這樣的寫法是有問題的,super好像規定只能用一次 : : 請問我要怎麼從C裡面call到A的tell()呢? 推文有提到如果C要call A的tell(),何不直接繼承A,或另寫方法,或建立物件。 這些都要改寫原程式碼。 bleed1979看了一下程式碼,覺得大概也只能改寫了。 提供我的建議(依照改動程度小至大): 1.建立物件: class C extends B { void tell() { (new A()).tell(); out.println("this is C"); } } 2.另寫方法: class B extends A { void tell() { out.println("this is B"); } void tellByA() { super.tell(); } } class C extends B { void tell() { tellByA(); out.println("this is C"); } } 3.static: class A { static void tell() { out.println("this is A"); } } class B extends A { static void tell() { out.println("this is B"); } } class C extends B { static void tell() { A.tell(); out.println("this is C"); } } 特別注意,bleed1979反對改寫為直接繼承A。 這個提議雖然是可以直接呼叫A的tell(), 但動到原有架構,為不可行的方案。 應該還有其他方法,就待版友補完吧。 : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 124.219.31.93 : ※ 文章網址: http://www.ptt.cc/bbs/java/M.1418962556.A.4EB.html : → sCHb68: 在 class C 正確用一個 super , 12/19 12:31 : → sCHb68: 然後在 class B 再使用 super 不知能否解決原PO問題。 12/19 12:31 : → egheee: 我就是想要跳過B直接call A的,這樣的方式會連B一起call到 12/19 14:06 : 推 gpctv: 那為何不直接在C建立物件就可直接call C的tell方法啦?! 12/19 14:55 : 推 gpctv: 不曉得這樣你懂不懂我的意思 12/19 14:58 : → ssccg: class封裝來說,繼承就是取得parent的非private的member 12/19 15:04 : → ssccg: 但是parent又去繼承了什麼東西是parent class的實作細節 12/19 15:04 : → ssccg: child class知道parent有tell(),但不該知道parent的第幾層 12/19 15:05 : → ssccg: parent有個tell(),那不是由繼承能使用的介面 12/19 15:05 : → ssccg: 你想跳過B這件事就有問題了,C本來就不該知道B是繼承了什麼 12/19 15:07 : → ssccg: C只知道B提供什麼,不知道那是B自己實做還是繼承來的 12/19 15:08 : 推 Peruheru: 所以你如果要A的什麼,你應該是去繼承A,而不是繼承B 12/19 15:08 : → Peruheru: 不然就是B當初設計就要為A的tell()另外提供一個方法 12/19 15:10 : → Peruheru: 比如說tellbyA之類的 12/19 15:11 : → Peruheru: B表示:朕不給的,你不能要 12/19 15:11 : → swpoker: has is use 12/19 15:14 : 推 gpctv: 樓上說的其實很有道理,但是你硬要這樣做那就建立物件吧! 12/19 15:36 : → gpctv: http://pastie.org/9789546 12/19 15:36 -- 看到這類問題,bleed1979就真的bleed了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.135.203.156 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1418986404.A.6BD.html

12/30 22:50, , 1F
(new A()).tell() 錯得離譜。意思完全不一樣好不好
12/30 22:50, 1F
文章代碼(AID): #1Kb0EaQz (java)
討論串 (同標題文章)
文章代碼(AID): #1Kb0EaQz (java)