繁体   English   中英

如何从继承类调用的抽象类中调用抽象方法

[英]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);
  }
}

笔记:

  • 没有必要将print“is abstract”放入抽象方法中。 java语言有一个关键字来表达这个事实。
  • 子类应该只是关于实现抽象方法(可能以不同的方式)。 您绝对希望子类更改基类的其他方法的实现 您的基类定义了一个契约 - 子类应遵循该类(如Liskov替换原则所述 )。

换句话说:将公共部分单独放在基类中,并确保在那里必须使用必要的abstract方法来实现。 但要避免多次实施方法。 这只会导致混乱和奇怪的错误。

(new Obj()).update(10.0f)调用Obj::update调用Abstract::update调用this.updateMotionY 因为thisObj一个实例,所以它调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM