2010-01-26 58 views
2

除了在子类上明确添加一个方法来调用super方法外,还有什么可以暂时“取消隐藏”吗?我想在Test2实例上调用super.blah()方法。我必须使用像originalBlah这样的方法,还是有另一种方法?Java隐藏:客户端类调用`super`的任何方式?

public class TestingHiding { 
    public static void main(String[] args) { 
     Test1 b = new Test2(); 
     b.blah(); 
    } 
} 

class Test2 extends Test1 { 
    public void blah() { 
     System.out.println("test2 says blah"); 
    } 

    public void originalBlah() { 
     super.blah(); 
    } 
} 

class Test1 { 
    public void blah() { 
     System.out.println("test1 says blah"); 
    } 

} 

编辑:对不起添加到问题在游戏中后期,但我有一个闪存的(我认为):在C#这是不同的?这取决于你有哪些课程think(Test1或Test2)?

回答

3

据我所知,你想要做一些像Test1 b = new Test2(); b.super.blah()。这是无法完成的,super严格限于从子类内部调用到超类。

+0

谢谢,我希望那不是真的... – 2010-01-26 10:51:28

2

当你需要这样的事情时,很难想象情况。

您可以禁止方法覆盖。
你也可以考虑Template Method模式技术。

+0

是不是'模板方法'只是一个不同名称的多态性? – 2010-01-26 10:51:03

+0

@yar:是且不是,'template method'是模式的名称,每个实现的不同之处仅在于一些非常细微的细节,因此并不需要额外/超越代码来完成他们的工作。与往常一样,维基百科的例子有点令人困惑,请查看以下两个链接获取更多信息:http://c2.com/cgi/wiki?TemplateMethod http://www.javapractices.com/topic/TopicAction.do?Id=164 – Esko 2010-01-26 10:55:45

+0

非常好,谢谢Mykola和@Esko – 2010-01-26 11:17:10

3

不,没有办法颠覆这种继承的概念。

+0

谢谢,这就是我所看到的经验... – 2010-01-26 10:49:03

+0

+1。如果你发现你想做那样的事情,那么也许你应该看看对象组合而不是子类化,这为客户端代码提供了更多的灵活性。 – Thilo 2010-01-26 10:58:18

+0

谢谢@Thilo。我通常总是避免子类化,并且更倾向于'具有'到'是'的关系。但是这个例子出现了,只是想知道Java是否提供了这个功能。 – 2010-01-26 11:18:35

1

简单的答案是:你不能

你可以有嗒嗒是

class Test2 extends Test1 { 
    public void blah() { 
     if("condition"){ 
      super.blah() 
     } 
     System.out.println("test2 says blah"); 
    } 

} 

还是走originalBlah方式,或完全解耦嗒嗒实施能够调用你需要取其实现,但就是这样。