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;
}
}