免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 12925 | 回复: 23
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-08 20:40 |只看该作者 |倒序浏览
已知:
1、类C继承于类B,类B继承于类A
2、类A、B、C中都定义有名为meth()的方法
请问,在类C的meth中:
1、如何调用A的meth方法?
2、如何调用B的meth方法?
3、super.meth() 调用的是A的meth还是B的meth?

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

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

class C extends B {
    public void meth()
    {
        如何调用A的meth方法
        如何调用B的meth方法
        super.meth() 调用的是A的meth还是B的meth
    }
}


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();
    }
}


请各位解答哦!

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

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
2 [报告]
发表于 2008-08-09 14:38 |只看该作者
>如何调用A的meth方法
>如何调用B的meth方法
>super.meth() 调用的是A的meth还是B的meth

此处的super.meth()调用的时B的meth方法。通常会调用父类的方法,调用爷爷类的方法,我没有用过。super.super.meth()是调用A的meth方法?可以试试。

论坛徽章:
0
3 [报告]
发表于 2008-08-09 15:36 |只看该作者
不经实验确实可行的办法
new A().method();

论坛徽章:
0
4 [报告]
发表于 2008-08-10 09:31 |只看该作者
我觉得这是不可能的,也是没有意义的是事情...
假如允许C类中调用A类中的方法,显然会破坏类的封装性,而且也与信息隐藏的原则是相违背的。
假如有一大串A、B、C、....、Z这样的类依次继承的话,难道Z类有必要需要知道A...Y所有的实现吗?如果这样的话,面向对象中的继承就成了一团浆糊了,代码会变的相当难于维护。
ps:继承的机制目前似乎确实有缺点的,所以许多书上都强调:组合优先于继承

论坛徽章:
0
5 [报告]
发表于 2008-08-10 11:50 |只看该作者
原帖由 liuex 于 2008-8-10 09:31 发表
我觉得这是不可能的,也是没有意义的是事情...
假如允许C类中调用A类中的方法,显然会破坏类的封装性,而且也与信息隐藏的原则是相违背的。
假如有一大串A、B、C、....、Z这样的类依次继承的话,难道Z类有必要 ...


态度是没错,不过允许C类中调用A类的方法,不是显然破坏封装的事,首先还是要看访问权限,既然A中的是public的,那么也就没什么隐藏可言了。不过想要好一点的实现楼主的想法,我认为是从类的设计上入手,当然是你得有权力修改父类
B类的method(){
  System.out.println("B.meth");
  super.method();

这样不就行了。
你用eclipse声称override的时候还不是默认都添加了super.methodName();对吧

论坛徽章:
0
6 [报告]
发表于 2008-08-10 15:19 |只看该作者
原帖由 艾斯尼勒 于 2008-8-10 11:50 发表


态度是没错,不过允许C类中调用A类的方法,不是显然破坏封装的事,首先还是要看访问权限,既然A中的是public的,那么也就没什么隐藏可言了。不过想要好一点的实现楼主的想法,我认为是从类的设计上入手,当 ...


public 方法公开的只是接口,而不一定是实现。就像jdk类库许多public方法的具体实现都被迁移到了sun.*的包中。
这时所谓的public方法就是告诉你:这个公开方法(接口)提供的这个功能,我们会在一定时期内不发生改变,但是至于我们是如何实现这些功能的,你没有必要知道。我们保持随时修改这些具体实现细节的权利。

暴露过多实现细节,类继承层次之间的依赖性过大,还谈啥封装,还讲啥重用...

你说的有一点是对的,假如子类居然要调用于它的特定父类的父类(的父类...)的具体实现的话,这个类的继承层次的设计是有问题的。

ps:你举的那个例子是有问题的。你在B类的meth()方法中把同一件事做了两次(B类自己println的和A类的println)。
想像一下假如meth()实现的功能是向数据库中插入一条记录而不是简单的println(),你的B.meth()逻辑上就出问题了

论坛徽章:
0
7 [报告]
发表于 2008-08-11 01:12 |只看该作者
原帖由 liuex 于 2008-8-10 15:19 发表


public 方法公开的只是接口,而不一定是实现。就像jdk类库许多public方法的具体实现都被迁移到了sun.*的包中。
这时所谓的public方法就是告诉你:这个公开方法(接口)提供的这个功能,我们会在一定时期内不 ...


恩,这个没有矛盾。public自然可以调用,我也只是说调用A类的method不破坏封装,这里不是问题。
至于举的例子,抱歉那个不是例子,纯粹是针对楼主问题特例的解决方案,不具通用性这点没说清是我的错

论坛徽章:
0
8 [报告]
发表于 2008-08-11 09:33 |只看该作者
按照艾斯尼勒的方法应该可以实现。
但是一般在程序设计上不应该出现这样的问题,面向对象程序设计对类的设计是很重要的

论坛徽章:
0
9 [报告]
发表于 2008-08-11 13:55 |只看该作者
我觉得这是个设计的问题,如果真的有这个需求的话,说明类B没有设计好。

论坛徽章:
0
10 [报告]
发表于 2008-08-12 20:10 |只看该作者
楼上的几位大虾,你们还没告诉我怎么“在类C的meth中调用类A的meth”?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP