免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 笨小鸡
打印 上一主题 下一主题

借人气急问:孙子类如何调用爷爷类的同名方法? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-08-13 09:29 |只看该作者
原帖由 笨小鸡 于 2008-8-12 20:10 发表
楼上的几位大虾,你们还没告诉我怎么“在类C的meth中调用类A的meth”?

A a = new A();
a.meth;

论坛徽章:
0
12 [报告]
发表于 2008-08-13 10:47 |只看该作者
A c = (A) new C();
c.meth();

论坛徽章:
0
13 [报告]
发表于 2008-08-13 12:27 |只看该作者
1、先谢谢starxing和thehenry!

2、题目可能表达的有些模糊,我希望是在C的meth中调用“this对象”中继承于类型A的meth方法,c++的示例如下:
class A {
    void meth();
}

class B : A {
    void meth();
}

class C : B {
    void meth()
    {
        A::meth();
    }
}

(问题1) 如何在Java中完成类似上面这段代码的功能?
(问题2) 或者在Java中无法完成类似上面这段代码的功能?


3、而如下的代码创建了一个新的类型为A的对象,调用的是新的实例对象的meth方法
class A {
    void meth();
}

class B extends A {
    void meth();
}

class C extends B {
    void meth()
    {
        A a = new A();
        a.meth();
    }
}


4、根据我的测试,javac不能接受下面的语法
class A {
    void meth()
    {
    }
}

class B extends A {
    void meth()
    {
    }
}

class C extends B {
    void meth()
    {
        super.super.meth();
    }
}


请各位解答哦!

论坛徽章:
0
14 [报告]
发表于 2008-08-13 12:44 |只看该作者
运用匿名对象可以解决这个问题,代码如下:
class A {
    void meth()
    {
    }
}

class B extends A {
    void meth()
    {
    }
}

class C extends B {
    void meth()
    {
        new A().meth();
    }
}

论坛徽章:
0
15 [报告]
发表于 2008-08-13 13:14 |只看该作者
原帖由 jilichao 于 2008-8-13 12:44 发表
运用匿名对象可以解决这个问题,代码如下:
运用匿名对象可以解决这个问题,代码如下:
class A {
    void meth()
    {
    }
}

class B extends A {
    void meth()
    {
    }
}

class C extends B {
    void meth()
    {
        new A().meth();  创建了一个新的对象,调用的是新创建对象的meth()方法
    }
}

这段代码创建了一个新的对象,调用的是新创建对象的meth()方法,我希望的是调用this对象的继承于A中的meth()方法,即使用java完成如下功能的c++程序:
class A {
    void meth();
}

class B : A {
    void meth();
}

class C : B {
    void meth()
    {
        A::meth();  调用this对象的继承于A中的meth()方法
    }

}

[ 本帖最后由 笨小鸡 于 2008-8-13 13:17 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2008-08-13 13:38 |只看该作者
new A().meth();
是个可行的办法,虽然跟楼主想要的稍有区别,但事实上在C类中A的meth已经被B的meth覆盖掉了,A的meth对C来说是不可见的,无法像C++中那样调用。而java的成员方法必须有对象才可以调用(C++不了解),也就是说java不能做到楼主想象的那种事,但我想new A().meth()应该可以得到同样的效果

另外,亨利的方法貌似是错误的

[ 本帖最后由 艾斯尼勒 于 2008-8-13 13:39 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2008-08-13 13:43 |只看该作者

恢复

几个说明:
   第一:请注意你在用OO,这样,如果B中要调用上层方法,必须在B中加上supper.XX(), 然而B中没有,从OO的思想上讲,设计B类的人就已经放弃了调用A的方法(否则他会加上的)。你C是从B中继承的, 你继承B,就要认可B的这种放弃, 当然你不能绕过B直接去调用A的方法,否则继承的规则就被打破了。(说白了,继承只是父子之间的事,孙子和爷爷没关系。 如果要用爷爷的东西,必须通过father,如果father已经放弃了,你孙子还想用爷爷的,那是绝对不行的)
  第二:如果你想实现, 那就应该在B中,加supper.XX()。 这样执行C方法时,就简洁执行了A(注意, 实际C并没有调用A,是B调用A的。 B中的supper.XX()和别的其他代码没有任何特殊之处)。
  计算机中的所有思想,都是来用于现实,服务于现实。是对现实的抽象。

论坛徽章:
0
18 [报告]
发表于 2008-08-13 15:23 |只看该作者
赞成楼上说的,楼主好好考虑考虑,如果不想用匿名对象的话,恐怕没其他办法了。况且你用匿名对象把方法调用了,对你的代码没有丝毫的损害呀,功能是一样的

论坛徽章:
0
19 [报告]
发表于 2008-08-13 20:58 |只看该作者
艾斯是对我讲的吗

我那种写法就是向上转型,应该没有错的,另外我对楼主的想法做了试验:

public class A {
    public void meth(A a){
        System.out.println("A.meth");
    }
}

public class B extends A {
    public void meth(B b){
        System.out.println("B.meth");
    }
}

public class C extends B {
    public void meth(C c) {
        B b = (B) c;
        b.meth(b);
        A a = (A) b;
        a.meth(a);
    }

    public static void main(String[] args) {
        C c = new C();
        c.meth(c);
    }
}


输出:

B.meth
A.meth

这种写法就是需要带个参数,将自身的引用传过去就能解决问题了。不知道这个是不是楼主的目的。

[ 本帖最后由 thehenry 于 2008-8-13 21:00 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2008-08-13 22:23 |只看该作者
原帖由 thehenry 于 2008-8-13 20:58 发表
艾斯是对我讲的吗

我那种写法就是向上转型,应该没有错的,另外我对楼主的想法做了试验:

public class A {
    public void meth(A a){
    &nbsp ...

谢谢!
但是,我太钻牛角剑了,我的目的是希望能够像c++种的"A::meth()"那样直接调用,还是谢谢大家了。

PS:这道题蛮BT的,以后我要是有机会招人就出这道题了,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP