找回密码
 FreeOZ用户注册
查看: 1838|回复: 14
打印 上一主题 下一主题

[论坛技术] 请教一个Java问题

[复制链接]
跳转到指定楼层
1#
发表于 14-5-2009 20:34:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
如果有三个类,B, D, G,其中G是D的子类,D是B的子类。

现在B有一个方法
public int x();
在D中被override了,而G在调用D的x操作时可以用:super.x(),
但如果G要调用B的x呢?

例如,我想在G中实现一个新的
int x() {
   return D中的x() + B中的x();
}

谢谢
回复  

使用道具 举报

2#
发表于 14-5-2009 23:41:20 | 只看该作者
super.super.x()

可以用:getSuperclass()

评分

参与人数 1威望 +20 收起 理由
hoopoos + 20 恭喜你!答对了!

查看全部评分

回复  

使用道具 举报

3#
发表于 15-5-2009 01:58:35 | 只看该作者
好像不行吧。
可以不用这么做吧,估计一般也不会这么调用。
回复  

使用道具 举报

4#
发表于 15-5-2009 02:32:12 | 只看该作者
同意LS的,一般不会这么用啊。这么用觉得有logical design的问题。
G应该做B的subclass.
回复  

使用道具 举报

5#
发表于 15-5-2009 07:57:07 | 只看该作者
确实是一个design问题
如果非要这么作的话我有一个主意
在B里定义一个 Y(){ return x() }
在G里就可以  X(){ return  super.X()+Y()   }
回复  

使用道具 举报

6#
发表于 15-5-2009 09:58:36 | 只看该作者
public class B {
        public int x()
        {
                System.out.println("B....");
                return 1;
        }
}

public class D extends B{
        public int x()
        {
                System.out.println("D....");
                return 2;
        }
}

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class G extends D{
        public int x()
        {
                System.out.println("G....");
               
                Class superclass= this.getClass().getSuperclass();
               
                return callsuper(superclass)+callsuper(superclass.getSuperclass());
               
        }
       
        public static void main(String[] s)
        {
                G g=new G();
                System.out.println("X="+g.x());
        }
       
        private int callsuper(Class superclass)
        {
                try {
                        Method  mx = superclass.getMethod("x", null);
                        Integer ret=(Integer)mx.invoke(superclass.newInstance(), null);
                        if (ret!=null) return ret.intValue();
                } catch (Exception e) {
                        e.printStackTrace();
                }

                return -999;
        }
}

Eclipse上测试通过,按照这个反射的方法,你可以任意选择调用hierarchy tree中的方法。
回复  

使用道具 举报

7#
 楼主| 发表于 15-5-2009 15:38:36 | 只看该作者
原帖由 hoopoos 于 15-5-2009 09:58 发表
public class B {
        public int x()
        {
                System.out.println("B....");
                return 1;
        }
}

public class D extends B{
        public int x()
        {
                System.out.println("D....");
                return 2;
        }
}

impor ...


reflect的确很好很强大,但出来的不是“我的”,是“别人的”
回复  

使用道具 举报

8#
发表于 15-5-2009 15:44:50 | 只看该作者

回复 #7 key 的帖子

不懂,理解力差,什么意思?
回复  

使用道具 举报

9#
发表于 15-5-2009 16:15:08 | 只看该作者
原帖由 key 于 15-5-2009 15:38 发表


reflect的确很好很强大,但出来的不是“我的”,是“别人的”


说明你占有欲比较强烈
回复  

使用道具 举报

10#
 楼主| 发表于 15-5-2009 18:44:02 | 只看该作者
原帖由 coredump 于 15-5-2009 16:15 发表


说明你占有欲比较强烈


打瓜你!哈哈。。。

我是说通过reflect出来的不是原来对象上操作,而是另外instant一个对象进行操作
回复  

使用道具 举报

11#
发表于 15-5-2009 18:59:55 | 只看该作者
提示: 作者被禁止或删除, 无法发言
that's terrible design. shouldn't do that.
回复  

使用道具 举报

12#
发表于 15-5-2009 19:14:10 | 只看该作者
原帖由 black_zerg 于 15-5-2009 18:59 发表
that's terrible design. shouldn't do that.

agree!
回复  

使用道具 举报

13#
发表于 15-5-2009 19:57:12 | 只看该作者
B,D不能改的话, G去composite好些

[ 本帖最后由 肉丝 于 15-5-2009 20:02 编辑 ]
回复  

使用道具 举报

14#
 楼主| 发表于 15-5-2009 20:08:05 | 只看该作者
原帖由 frankiehuang 于 15-5-2009 19:14 发表

agree!


先谈能不能做到,再谈是不是bad taste嘛。
似乎在语法范围内是不受到支持的
回复  

使用道具 举报

15#
发表于 18-5-2009 07:43:35 | 只看该作者
原帖由 lufumin1832 于 15-5-2009 07:57 发表
确实是一个design问题
如果非要这么作的话我有一个主意
在B里定义一个 Y(){ return x() }
在G里就可以  X(){ return  super.X()+Y()   }

??
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 7-4-2025 15:37 , Processed in 0.041047 second(s), 34 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表