[問題] 多繼承super的問題

看板java作者 (阿平)時間9年前 (2014/12/19 12:15), 編輯推噓4(4014)
留言18則, 6人參與, 最新討論串1/3 (看更多)
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()呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 124.219.31.93 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1418962556.A.4EB.html

12/19 12:31, , 1F
在 class C 正確用一個 super ,
12/19 12:31, 1F

12/19 12:31, , 2F
然後在 class B 再使用 super 不知能否解決原PO問題。
12/19 12:31, 2F

12/19 14:06, , 3F
我就是想要跳過B直接call A的,這樣的方式會連B一起call到
12/19 14:06, 3F

12/19 14:55, , 4F
那為何不直接在C建立物件就可直接call C的tell方法啦?!
12/19 14:55, 4F

12/19 14:58, , 5F
不曉得這樣你懂不懂我的意思
12/19 14:58, 5F

12/19 15:04, , 6F
class封裝來說,繼承就是取得parent的非private的member
12/19 15:04, 6F

12/19 15:04, , 7F
但是parent又去繼承了什麼東西是parent class的實作細節
12/19 15:04, 7F

12/19 15:05, , 8F
child class知道parent有tell(),但不該知道parent的第幾層
12/19 15:05, 8F

12/19 15:05, , 9F
parent有個tell(),那不是由繼承能使用的介面
12/19 15:05, 9F

12/19 15:07, , 10F
你想跳過B這件事就有問題了,C本來就不該知道B是繼承了什麼
12/19 15:07, 10F

12/19 15:08, , 11F
C只知道B提供什麼,不知道那是B自己實做還是繼承來的
12/19 15:08, 11F

12/19 15:08, , 12F
所以你如果要A的什麼,你應該是去繼承A,而不是繼承B
12/19 15:08, 12F

12/19 15:10, , 13F
不然就是B當初設計就要為A的tell()另外提供一個方法
12/19 15:10, 13F

12/19 15:11, , 14F
比如說tellbyA之類的
12/19 15:11, 14F

12/19 15:11, , 15F
B表示:朕不給的,你不能要
12/19 15:11, 15F

12/19 15:14, , 16F
has is use
12/19 15:14, 16F

12/19 15:36, , 17F
樓上說的其實很有道理,但是你硬要這樣做那就建立物件吧!
12/19 15:36, 17F

12/19 15:36, , 18F
文章代碼(AID): #1KawPyJh (java)
文章代碼(AID): #1KawPyJh (java)