[英]How to call abstract method from abstract class called by inherit class
我想从继承类调用的抽象类中调用抽象类的方法。
抽象类:
public abstract class Abstract {
protected void updateMotionY(float deltaTime) {
System.out.println("Abstrcat updateMotionY");
}
public void update(float deltaTime) {
this.updateMotionY(deltaTime);
}
}
继承类:
public class Obj extends Abstract {
@Override
protected void updateMotionY(float deltaTime) {
System.out.println("updateMotionY");
super.updateMotionY(deltaTime);
}
@Override
public void update(float deltaTime) {
super.update(deltaTime);
}
}
主要方法类:
public static void main(String[] args) {
(new Obj()).update(10.0f);
}
每当我尝试在主类中调用new Obj().update()
方法时,它会打印“updateMotionY”和“Abstrcat updateMotionY”。 我想只获得“Abstrcat updateMotionY”。
谁能告诉我如何解决这个问题?
我认为你以非常错误的方式使用abstract
。 你的基类应该是这样的:
public abstract class Abstract {
protected abstract void updateMotionY(float deltaTime);
public final void update(float deltaTime) {
this.updateMotionY(deltaTime);
}
}
笔记:
换句话说:将公共部分单独放在基类中,并确保在那里必须使用必要的abstract
方法来实现。 但要避免多次实施方法。 这只会导致混乱和奇怪的错误。
(new Obj()).update(10.0f)
调用Obj::update
调用Abstract::update
调用this.updateMotionY
。 因为this
是Obj
一个实例,所以它调用Obj::updateMotionY
。
这将打印“updateMotionY”。
然后调用super.updateMotionY(deltaTime)
,它是Abstract::updateMotionY
。
这将打印“Abstrcat updateMotionY”。
这就是调用层次结构的结束,一切都在展开。
从根本上说,你的困惑似乎源于this.updateMotionY(deltaTime);
在Abstract
类中,解析为Obj
类中的updateMotionY
。 这基本上是多态性的全部要点 。
你可以做的一件事是添加一个包含实际实现的私有方法(以便它不能被覆盖),并遵从它:
public abstract class Abstract {
private void motionY(float dt)
{
System.out.println("Abstrcat updateMotionY");
}
protected void updateMotionY(float deltaTime) {
motionY(deltaTime);
}
public void update(float deltaTime) {
motionY(deltaTime);
}
}
如果你只想执行摘要超类'方法,那么简单的解决方案是在你的Obj类中调用super.updateMotionY
而不是super.update
public class Obj extends Abstract {
@Override
protected void updateMotionY(float deltaTime) {
System.out.println("updateMotionY: ");
super.updateMotionY(deltaTime);
}
@Override
public void update(float deltaTime) {
super.updateMotionY(deltaTime);
}
}
您无法创建Abstract类的实例,因此您正在创建Obj类的实例。 由于您的要求只是调用Abstract类的方法,那么为什么要覆盖方法updateMotionY
根据您的要求,这是您需要做的抽象类:
public abstract class Abstract {
protected void updateMotionY(float deltaTime) {
System.out.println("Abstrcat updateMotionY");
}
public void update(float deltaTime) {
this.updateMotionY(deltaTime);
}
}
继承类:
public class Obj extends Abstract{
/*@Override
protected void updateMotionY(float deltaTime) {
System.out.println("updateMotionY");
super.updateMotionY(deltaTime);
}*/
@Override
public void update(float deltaTime) {
super.update(deltaTime);
}
}
我已经评论了被覆盖的代码,它将为您提供所需的结果。 此外, https: //stackoverflow.com/users/8466177/steven-laan给出的答案也适用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.