java - 如何在Java中重写方法但仍然使用变量?

标签 java inheritance

我对继承和所有有趣的东西还很陌生。所以我有一个敌人类别,它分为一堆不同类型的敌人。我正在做的最后一个敌人将有一个与其余敌人不同的tick(),所以我需要覆盖。但是我不知道如何覆盖,因为那样它就无法使用敌人类中的所有变量。它给我的选项是使我的 get 方法在我的 GameObject 抽象类 -> Enemy -> Smart Enemy 中保持静态。但我对此并不陌生,我觉得这可能会引起问题?

package first.Game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;


public class Enemy extends GameObject{

    private Handler handler;
    private Color c; 
    private int eWidth, eHeight, speedX, speedY, x, y;

    public Enemy(int x, int y, int eWidth, int eHeight, int speedX, int speedY, Color c, ID id, Handler handler)
    {
        super(x, y, id);

        this.x = x;
        this.y = y;
        this.id = ID.Enemy;
        this.c = c;
        this.eWidth = eWidth;
        this.eHeight = eHeight;
        this.handler = handler;
        this.speedX = speedX;
        this.speedY = speedY;
    }

    public Rectangle getBounds()
    {
        return new Rectangle(x, y, eWidth, eHeight);
    }

    public void tick()
    {
        x += speedX;
        y += speedY;

        if(y <= 0 || y >= Game.HEIGHT - 48) speedY *= -1; //What can I do instead of 48?
        if(x <= 0 || x >= Game.WIDTH - 32) speedX *= -1;

        handler.addObject(new Trail(x, y, ID.Trail, c, eWidth, eHeight, 0.03f, handler));
    }

    public void render(Graphics g)
    {
        g.setColor(c);
        g.fillRect(x, y, eWidth, eHeight);
    }
}
package first.Game;

import java.awt.Color;

public class SmartEnemy extends Enemy{

    private GameObject player;
    //private Handler handler;
    //private int x, y, speedX, speedY, eWidth, eHeight;
    //private Color c;

    public SmartEnemy(int x, int y, Handler handler)
    {
        super(x, y, 16, 16, 0, 0, Color.green, ID.Enemy, handler);
        //this.handler = handler;
        //this.x = x;
        //this.y = y;

        for(int i = 0; i < handler.object.size(); i++)
        {
            if(handler.object.get(i).getId() == ID.Player)
                player = handler.object.get(i);
        }
    }

    @Override
    public void tick()
    {
        float diffX = x - player.getX();  //- 8
        float diffY = y - player.getY();  //- 8
        float distance = (float) Math.sqrt((x - player.getX()) * (x - player.getX()) + (y - player.getY()) * (y - player.getY()));

        speedX = (int) ((-1.0 / distance) * diffX);
        speedY = (int) ((-1.0 / distance) * diffY);


        if(y <= 0 || y >= Game.HEIGHT - 48) speedY *= -1; //What can I do instead of 48?
        if(x <= 0 || x >= Game.WIDTH - 32) speedX *= -1;

        handler.addObject(new Trail(x, y, ID.Trail, c, eWidth, eHeight, 0.03f, handler));
    }
}

最佳答案

如果您希望从 SmartEnemy 访问 Enemy 的实例变量,您有多种选择:

  1. 如果您只需要只读访问权限,请向 Enemy 类添加一个 getter 方法,该方法返回所需 Enemy 实例变量的值。如果只有 Enemy 层次结构中的类应该有权访问该实例变量的值,请为其指定 protected 访问修饰符。

  2. 如果您还需要写访问权限,请添加带有 protected 访问修饰符的 setter 方法,或者为实例变量本身提供 protected 访问修饰符。

关于java - 如何在Java中重写方法但仍然使用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59442695/

相关文章:

java - 在 Java 中使用相同的地址和端口进行接受和连接

php - 扩展另一个的 PHP 类如何继承私有(private)函数?

java - 为什么 jGit 的 RevWalk.reset() 方法行为异常?

java - 使用 Java 复制文件时结果为空

python - 从构造函数中以正确的顺序调用加载函数

c++ - 覆盖 C++ 虚方法

javascript - javascript继承之间的区别

pythons 'print' 语句不调用 .write() 方法?

java - 从jsp servlet运行mapreduce作业

java - JTextField 的闪烁颜色