如果我创建一个名为Turret
的父类,并希望创建此类SimpleTurret
,RapidFireTurret
,CannonTurret
的子类,我将如何调用我想要使用的内容RapidFireTurret
并通过父Turret
类提取相关信息?
编辑:已添加上下文
炮塔
public class Turrets {
int health, x, y;
Bitmap sprite;
public int getHealth() {return health;}
public int getX() {return x;}
public int getY() {return y;}
public Bitmap getSprite() {return sprite;}
}
SimpleTurret
public class SimpleTurret extends Turrets {
public SimpleTurret(Context context){
sprite = BitmapFactory.decodeResource(context.getResources(), R.drawable.simple_turret);
health = 50;
x = 100;
y = 100;
}
}
GameView
public class GameView extends SurfaceView implements Runnable {
private boolean running = true;
SurfaceHolder surfaceHolder = getHolder();
SimpleTurret simpleTurret;
public GameView (Context context){
super(context);
simpleTurret = new SimpleTurret(context);
Thread thread = new Thread(this);
thread.start();
}
@Override
public void run() {
while (running){
DrawCanvas();
}
}
public void DrawCanvas(){
Canvas canvas = surfaceHolder.lockCanvas();
if (surfaceHolder.getSurface().isValid()){
canvas.drawColor(Color.RED);
canvas.drawBitmap(simpleTurret.getSprite(), simpleTurret.getX(), simpleTurret.getY(), null);
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
答案 0 :(得分:1)
你应该提供更好答案的代码,但这应该回答你的一些问题。
首先,您需要使Turrent
类包含子类之间的所有共享字段,然后使用构造函数来设置这些字段,以及Turrent
类上的getter和setter。
public class Turrent {
private int dmg;
private float fireRate;
private int maxAmmo;
public Turrent(int dmg, float fireRate, int maxAmmo){
this.dmg = dmg;
this.fireRate = fireRate;
this.maxAmmo = maxAmmo;
}
///example of a read only field
public int getDmg(){return this.dmg;}
public void setFireRate(float fireRate){this.fireRate = fireRate;}
public float getFireRate(){return this.fireRate;}
///other getters and setters plus functional code
}
然后你想要添加其他子类。每个子类都应该有一个构造函数,该构造函数传入所需的参数并调用Turrent
类的超级构造函数。
public class SimpleTurrent extends Turrent {
public SimpleTurrent(int dmg, float fireRate, int maxAmmo){
super(int dmg, float fireRate, int maxAmmo);
}
/// other code
}
您还需要添加覆盖方法以及需要在子类中的任何额外方法。这些新方法应该在类之间具有不同的功能。如果他们共享功能,那么他们应该包含在Turrent
类中。
public class Turrent {
private int dmg;
private float fireRate;
private int maxAmmo;
public Turrent(int dmg, float fireRate, int maxAmmo){
this.dmg = dmg;
this.fireRate = fireRate;
this.maxAmmo = maxAmmo;
}
///example of a read only field
public int getDmg(){return this.dmg;}
public void setFireRate(float fireRate){this.fireRate = fireRate;}
public float getFireRate(){return this.fireRate;}
public void attack(Enemy enemy){
enemy.health = enemy.health-getDmg();
}
///other getters and setters plus functional code
}
_____________________________________________________
public class SimpleTurrent extends Turrent {
public SimpleTurrent(int dmg, float fireRate, int maxAmmo){
super(int dmg, float fireRate, int maxAmmo);
}
///overriden method that increases damage based on fire rate
public void attack(Enemy enemy){
enemy.health = enemy.health-getDmg()*getFireRate();
}
public void simpleTurrentSpecial(){
///whatever this could be
}
/// other code
}
如果你能通过传递更有帮助的数据来解释你的意思。现在我假设你的意思是变量存储在基类上并受子类的影响。如果您的子类只有不同的变量值,则不需要单独的类(这意味着类之间的函数永远不会有所不同。)如果是这种情况,那么您应该创建一个构建器类来填充{{1}上的变量} object基于什么" type"你想要它。
Turrent
查找构建器设计模式以获取更多相关信息。
您还需要一个服务类来处理所有这些代码。不应在Turrent newTurrent = TurrentBuilder.makeTurrent("Simple");
类中创建和使用它。
Turrent
我希望这可以帮助您快速了解您正在寻找的内容。