我最近发现了让我一直生气的事情。
每当我希望在具有特定接口的所有类中调用方法时,或者如果它们是扩展名,我希望有一个关键字与关键字 super 相反。基本上,我希望调用向下传递(如果一个类继承了一个方法,并且调用了超类中的方法,它也将在子类中调用)。是否有类似于我要求的东西?
修改: 我使用的当代方法是有效的,但不如我希望的那样高效。我只是想知道是否有一种从超类/超级接口调用已继承的方法的方法。我最后一次寻找这个,我也没找到。
注意:所有子类都是未知的,因此无法使用。唯一已知的类是超类,这就是我无法调用它的原因。这可以使用我目前正在使用的Reflections API来解决。但是,它并不总是符合我要搜索的内容。
答案 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,可以使基类的所有实例及其子类执行"回调"随时随地。