了解父母和继承的实际用途

时间:2018-01-19 17:30:04

标签: java class inheritance

如果我创建一个名为Turret的父类,并希望创建此类SimpleTurretRapidFireTurretCannonTurret的子类,我将如何调用我想要使用的内容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);
        }
    }
}

1 个答案:

答案 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

我希望这可以帮助您快速了解您正在寻找的内容。