从超类调用所有子类的方法?

时间:2014-06-19 15:37:31

标签: java inheritance super

我最近发现了让我一直生气的事情。

每当我希望在具有特定接口的所有类中调用方法时,或者如果它们是扩展名,我希望有一个关键字与关键字 super 相反。基本上,我希望调用向下传递(如果一个类继承了一个方法,并且调用了超类中的方法,它也将在子类中调用)。是否有类似于我要求的东西?

修改: 我使用的当代方法是有效的,但不如我希望的那样高效。我只是想知道是否有一种从超类/超级接口调用已继承的方法的方法。我最后一次寻找这个,我也没找到。

注意:所有子类都是未知的,因此无法使用。唯一已知的类是超类,这就是我无法调用它的原因。这可以使用我目前正在使用的Reflections API来解决。但是,它并不总是符合我要搜索的内容。

5 个答案:

答案 0 :(得分:3)

Java中的每个方法都是virtual,但static方法,final方法和构造函数除外,这意味着如果子类实现了被调用的方法,则子类的实现将被召唤。如果子类希望也调用立即超类方法,那么可以通过调用super来完成。

这在抽象类中很常见,其中一些基类被框架使用,但客户端应该覆盖。例如:

public abstract class Drawer{
  public void draw(){
     //setup code, etc common to all subclass implementations
     doDraw();
  }
  protected abstract void doDraw();
}

public class CircleDrawer extends Drawer{
  protected void doDraw(){
    //implementation of how to actually draw a circle
  }
}

现在,如果您有一个CircleDrawer的实例并且调用draw(),则会调用超类Drawer.draw()方法,而该方法又可以调用CicleDrawer.doDraw()

修改现在,如果CircleDrawer是这样的话:

public class CircleDrawer extends Drawer{
  public void draw(){
    //do stuff
  }
  protected void doDraw(){
    //implementation of how to actually draw a circle
  }
}

Drawer.draw()的实例上调用CircleDrawer总是调用CircleDrawer.draw()方法。

答案 1 :(得分:2)

如果你的意思是这样的话:

class A {
    public void func1(){
         //do stuff
         subclass.func1();
    }
}
class B extends A{
    public void func1(){
         //do more stuff
    }
}
class C extends A{
}

当我致电new C().func1()时会发生什么?请记住,func1不是抽象的,因此,您不能要求类来定义它。

更好的解决方案是执行以下操作:

abstract class A {
    public void func1(){
         //do stuff
         func2();
    }
    public abstract func2();
}
class B extends A{
    public void func2(){
         //do more stuff
    }
}

因此,您需要子类定义可以从超类调用的函数。

答案 2 :(得分:1)

没有这样的事情。在Java中调用override方法时,将始终调用最多于子类的方法。如果您也想调用父方法,则需要在雇佣员的每个班级方法中使用super.methodCall()

答案 3 :(得分:1)

不幸的是,我不相信你想要做的事情就像你想象的那样。从超类调用子类并不那么容易,因为并非所有子类都可能以相同的方式运行,因此该功能的通用关键字会造成严重破坏!虽然,通过"的基本上,我希望调用传递下来。"听起来你想要的是正常的继承。

只需定义所有子类在超类中具有的最通用的相似性,然后使用super()

简单地启动方法的每个子类定义

我并不是要指明显而易见的事情,但OO是为此而设计的,而不是针对你所要求的。我怀疑你在OO概念的典型武器库中找不到想要的方法

答案 4 :(得分:0)

我认为你很难描述你需要什么,我不这么认为:

  

每当我希望在具有特定接口的所有类中调用方法时,或者如果它们是扩展名

与此相同:

  

我想要一个与关键字super

相反的关键字

据我所知,在第一个中,您指的是为基类及其子类的所有实例调用方法。对于第二个,调用子类'方法正是在一个可能覆盖它的子类上调用该方法。

我不确定你要做什么,也许你应该用一个例子来澄清。最有可能的是,你的设计问题是以与你提议的方式不同的方式解决的。然而,一个"解决方案"在阅读你的问题时想到了。

我对C#和python的经验比使用Java更有经验(甚至没有那么多),但我确信如果我说愚蠢的事情,更有经验的程序员会毫不犹豫地纠正我

你应该拥有某种类型的基类类型的集合,并在每个对象上调用该方法,每个子类必须覆盖它。

也许使用通常用于重现事件触发的observer pattern,可以使基类的所有实例及其子类执行"回调"随时随地。