我对继承和所有有趣的东西还很陌生。所以我有一个敌人类别,它分为一堆不同类型的敌人。我正在做的最后一个敌人将有一个与其余敌人不同的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
的实例变量,您有多种选择:
如果您只需要只读访问权限,请向
Enemy
类添加一个 getter 方法,该方法返回所需Enemy
实例变量的值。如果只有Enemy
层次结构中的类应该有权访问该实例变量的值,请为其指定protected
访问修饰符。如果您还需要写访问权限,请添加带有
protected
访问修饰符的 setter 方法,或者为实例变量本身提供protected
访问修饰符。
关于java - 如何在Java中重写方法但仍然使用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59442695/