Java クラスの継承

public class CTest11 {
  public static void main(String[] args) {
    Soarer soarer = new Soarer();

    System.out.println(soarer.status());

    // ルーフ操作
    soarer.openRoof();
    System.out.println(soarer.status());

    // 加速
    for(int i=0; i<6; i++){
      soarer.accele();
    }
    System.out.println(soarer.status());

    // 走行中にルーフを開けようとする(失敗する)
    soarer.openRoof();
    System.out.println(soarer.status());

    // 減速して停止
    for(int i=0; i<20; i++){
      soarer.brake();
    }
    System.out.println(soarer.status());

    // 停止中なら閉じられる
    soarer.closeRoof();
    System.out.println(soarer.status());
  }
}

class Car {
  private int speed = 0;
  private final int maxSpeed;

  public Car(int maxSpeed){
    this.maxSpeed = maxSpeed;
  }

  public void accele(){
    setSpeed(speed + 5);
  }

  public void brake(){
    setSpeed(speed - 5);
  }

  protected void setSpeed(int newSpeed){
    if(newSpeed < 0) newSpeed = 0;
    if(newSpeed > maxSpeed) newSpeed = maxSpeed;
    speed = newSpeed;
  }

  public int getSpeed(){
    return speed;
  }

  public int getMaxSpeed(){
    return maxSpeed;
  }

  public boolean isStopped(){
    return speed == 0;
  }

  public String status(){
    return "速度: " + speed + "km/h (MAX " + maxSpeed + ")";
  }
}

class Soarer extends Car {
  private boolean roofOpen = false;

  // 例:ソアラは最高180
  public Soarer(){
    super(180);
  }

  // 車種特性:加速が少し強い
  @Override
  public void accele(){
    setSpeed(getSpeed() + 10);

    // 一定速度以上なら安全のため自動で閉じる
    if(getSpeed() >= 60 && roofOpen){
      roofOpen = false;
    }
  }

  @Override
  public void brake(){
    setSpeed(getSpeed() - 10);
  }

  public void openRoof(){
    // 走行中は危ないので禁止(停止中のみ)
    if(isStopped()){
      roofOpen = true;
    }
  }

  public void closeRoof(){
    roofOpen = false; // ←バグ修正:trueじゃなくてfalse
  }

  public boolean isRoofOpen(){
    return roofOpen;
  }

  @Override
  public String status(){
    String roof = roofOpen ? "屋根: OPEN" : "屋根: CLOSED";
    return super.status() + " / " + roof;
  }
}

投稿者: chosuke

趣味はゲームやアニメや漫画などです

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です