FreeOZ论坛

标题: 请教一个Java问题 [打印本页]

作者: key    时间: 14-5-2009 21:34
标题: 请教一个Java问题
如果有三个类,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();
}

谢谢
作者: coredump    时间: 15-5-2009 00:41
super.super.x()

可以用:getSuperclass()
作者: laysman    时间: 15-5-2009 02:58
好像不行吧。
可以不用这么做吧,估计一般也不会这么调用。
作者: gx043228    时间: 15-5-2009 03:32
同意LS的,一般不会这么用啊。这么用觉得有logical design的问题。
G应该做B的subclass.
作者: 周星星1832    时间: 15-5-2009 08:57
确实是一个design问题
如果非要这么作的话我有一个主意
在B里定义一个 Y(){ return x() }
在G里就可以  X(){ return  super.X()+Y()   }
作者: hoopoos    时间: 15-5-2009 10: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;
        }
}

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中的方法。
作者: key    时间: 15-5-2009 16:38
原帖由 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的确很好很强大,但出来的不是“我的”,是“别人的”
作者: hoopoos    时间: 15-5-2009 16:44
标题: 回复 #7 key 的帖子
不懂,理解力差,什么意思?
作者: coredump    时间: 15-5-2009 17:15
原帖由 key 于 15-5-2009 15:38 发表


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


说明你占有欲比较强烈
作者: key    时间: 15-5-2009 19:44
原帖由 coredump 于 15-5-2009 16:15 发表


说明你占有欲比较强烈


打瓜你!哈哈。。。

我是说通过reflect出来的不是原来对象上操作,而是另外instant一个对象进行操作
作者: black_zerg    时间: 15-5-2009 19:59
提示: 作者被禁止或删除, 无法发言 that's terrible design. shouldn't do that.
作者: frankiehuang    时间: 15-5-2009 20:14
原帖由 black_zerg 于 15-5-2009 18:59 发表
that's terrible design. shouldn't do that.

agree!
作者: 肉丝    时间: 15-5-2009 20:57
B,D不能改的话, G去composite好些

[ 本帖最后由 肉丝 于 15-5-2009 20:02 编辑 ]
作者: key    时间: 15-5-2009 21:08
原帖由 frankiehuang 于 15-5-2009 19:14 发表

agree!


先谈能不能做到,再谈是不是bad taste嘛。
似乎在语法范围内是不受到支持的
作者: 周星星1832    时间: 18-5-2009 08:43
原帖由 lufumin1832 于 15-5-2009 07:57 发表
确实是一个design问题
如果非要这么作的话我有一个主意
在B里定义一个 Y(){ return x() }
在G里就可以  X(){ return  super.X()+Y()   }

??




欢迎光临 FreeOZ论坛 (https://www.freeoz.org/ibbs/) Powered by Discuz! X3.2