java - 无法在我的车辆交易程序中销售卡车和 1 个 JUnit 错误(缺少抽象方法)

标签 java

在我的交易车辆(汽车或卡车)程序中,您可以出售单辆或多辆车辆并重新订购。出售的汽车交付时配备 40 升汽油,卡车交付时配备 80 升汽油。您还可以补充车辆和燃料。

-问题:它不允许我再销售卡车(以前可以)。当我运行交互式文件并尝试出售卡车时,没有任何反应。但对于汽车来说,即使它与汽车的代码相同,它也能工作。

此外,我在教授给我们的 JUnit 中遇到了 2 个 JUnit 错误。以下是错误:

public void testParentClass(){
    CarTrader trader1 = passengerCarTrader;
    trader1.checkAvailability(VehicleBrand.AUDI, 1);
    trader1.isSoldVehicleType(VehicleType.PASSENGER_CAR);
    trader1.reorderVehicles(VehicleBrand.AUDI, 1);

- CarTrader 类型的方法 checkAvailability(int, int) 未定义 - CarTrader 类型的方法 isSoldVehicleType(byte) 未定义 -CarTrader 类型的方法 reorderVehicles(int, int) 未定义

所以我认为这意味着抽象类没有在父类(super class)中实现。但我该如何实现呢?

公共(public)抽象无效checkAvailability(); 不起作用

它还说“PassengerCarTrader 类型必须实现继承的抽象方法 isSoldVehicle、checkAvailabilty、reorderVehicles。

public abstract class CarTrader {

    public static final float CAPACITY_DIESEL_LITERS = 350.f;
    public static final float CAPACITY_GAS_LITERS = 180.f;
    public static final int CAPACITY_PASSENGER_CARS = 15;
    public static final int CAPACITY_TRUCKS = 8;


    float gasStockLiters=180.f;
    float dieselStockLiters=250.f;
    int passengerCarsStock=15;
    int trucksStock=8;

    int mANStock=4;
    int scaniaStock=4;
    int audiStock=4;
    int bMWStock=4;
    int opelStock=4;
    int mercedesStock=3;

    public CarTrader(){

    }

    void setGasStockLiters(float gasStockLiters){
        this.gasStockLiters=gasStockLiters;
    }

    void setDieselStockLiters(float dieselStockLiters){
        this.dieselStockLiters=dieselStockLiters;
    }

    void setPassengerCarsStock(int passengerCarsStock){
        this.passengerCarsStock=passengerCarsStock;
    }

    void setTrucksStock(int trucksStock){
        this.trucksStock=trucksStock;
    }

    int getPassengerCarsStock(){
        return passengerCarsStock;
    }

    int getTrucksStock(){
        return trucksStock;
    }
    float getGasStockLiters(){
        return gasStockLiters;
    }
    float getDieselStockLiters(){
        return dieselStockLiters;
    }
    CarTrader(int a){
        this.audiStock=a;
    }


    public Vehicle sellVehicle(byte vehicleType, int brand){

    Vehicle soldCar=null;


    switch (vehicleType){


    case 0: 

        if (this.gasStockLiters>=Vehicle.TANK_SIZE_PASSENGER_CAR){


            switch (brand) {
            case VehicleBrand.AUDI:

                if (this.audiStock>=1){
                    this.audiStock = this.audiStock - 1;
                    this.gasStockLiters = this.gasStockLiters - Vehicle.TANK_SIZE_PASSENGER_CAR;
                    this.passengerCarsStock = this.passengerCarsStock - 1;
                    soldCar = new Vehicle(VehicleType.PASSENGER_CAR);
                } else {

                    System.err.println("Nicht genug AUDI oder Benzin vorhanden");
                }
                break;
            case VehicleBrand.BMW:
                if(this.bMWStock>=1){
                    this.bMWStock = this.bMWStock -1;
                    this.gasStockLiters = this.gasStockLiters - Vehicle.TANK_SIZE_PASSENGER_CAR ;
                    this.passengerCarsStock = this.passengerCarsStock - 1;
                    soldCar = new Vehicle(VehicleType.PASSENGER_CAR);
                } else {
                    System.err.println("Nicht genug BMW oder Benzin vorhanden");
                }
                break;
            case VehicleBrand.MERCEDES:
                if (this.mercedesStock>=1){
                    this.mercedesStock = this.mercedesStock - 1;
                    this.gasStockLiters = this.gasStockLiters - Vehicle.TANK_SIZE_PASSENGER_CAR;
                    this.passengerCarsStock = this.passengerCarsStock - 1;
                    soldCar = new Vehicle(VehicleType.PASSENGER_CAR);
                } else {
                    System.err.println("Nicht genug Mercedes oder Benzin vorhanden");
                }
                break;
            case VehicleBrand.OPEL:
                if(this.opelStock>=1){
                    this.opelStock = this.opelStock -1;
                    this.gasStockLiters = this.gasStockLiters - Vehicle.TANK_SIZE_PASSENGER_CAR;
                    this.passengerCarsStock = this.passengerCarsStock - 1;
                    soldCar = new Vehicle(VehicleType.PASSENGER_CAR);

                } else {
                    System.err.println("Nicht genug Opel oder Benzin vorhanden");
                }
                break;
            default: soldCar=null;

            break;
            }
        } else {
        soldCar=null;
        }

            System.out.println("Fahrzeug(e) erfolgreich verkauft");
    break;

    case VehicleBrand.MAN:

        if (this.dieselStockLiters>=Vehicle.TANK_SIZE_TRUCK){

            switch (brand) {
            case 1://MAN
                if (this.mANStock>=1){
                    this.mANStock = (this.mANStock-1);
                    trucksStock = trucksStock - 1;
                    dieselStockLiters = dieselStockLiters - Vehicle.TANK_SIZE_TRUCK;
                    soldCar = new Vehicle(VehicleType.TRUCK);
                    System.out.println("Fahrzeug(e) erfolgreich verkauft");
                } else {
                    soldCar=null;
                    System.err.println("Nicht genug MAN-Trucks oder Diesel vorhanden");

                }
                break;
            case VehicleBrand.SCANIA:
                if(this.scaniaStock>=1){
                    this.scaniaStock = this.scaniaStock -1;
                    trucksStock = trucksStock - 1;
                    dieselStockLiters = dieselStockLiters - Vehicle.TANK_SIZE_TRUCK;
                    System.out.println("Fahrzeug(e) erfolgreich verkauft");
                    soldCar = new Vehicle(VehicleType.TRUCK);
                } else {
                    soldCar=null;
                    System.err.println("Nicht genug Scania-Trucks oder Diesel vorhanden");

                }
                break;
            default: soldCar=null;
            }

            break;
            }
        else {
            soldCar=null;
        }
    }
        return soldCar;
    }








    public Vehicle[] sellVehicles(byte vehicleType, int brand, int amount){

    Vehicle[] soldCar= new Vehicle[amount];
        boolean sold=false;

        switch (vehicleType){
        case 0:

            if(this.dieselStockLiters>=Vehicle.TANK_SIZE_TRUCK*amount){

                switch (brand) {
                case VehicleBrand.MAN://MAN
                    if (this.mANStock>=amount){
                        this.mANStock = this.mANStock - amount;
                        trucksStock = trucksStock - amount;
                        dieselStockLiters = dieselStockLiters - Vehicle.TANK_SIZE_TRUCK*amount;
                        sold=true;
                    } else {
                        System.err.println("Nicht genug MAN-Trucks oder Diesel vorhanden");
                    }
                    break;
                case VehicleBrand.SCANIA://Scania
                    if(this.scaniaStock>=amount){
                        this.scaniaStock = this.scaniaStock -amount;
                        trucksStock = trucksStock - amount;
                        dieselStockLiters = dieselStockLiters - Vehicle.TANK_SIZE_TRUCK*amount;
                        sold=true;
                        } else {
                            System.err.println("Nicht genug Scania-Trucks oder Diesel vorhanden");
                    }
                    if (sold=true){
                        for (int i=0; i<amount; i++){
                            soldCar[i]=new Vehicle(VehicleType.TRUCK);
                        }

                        System.out.println("Fahrzeug(e) erfolgreich verkauft"); 
                    }
                    if (sold=false) {
                        for (int i=0; i<amount; i++){
                        soldCar[i]=null;
                        } 
                    }
                }
            }


        case 1:

            if (this.gasStockLiters>=Vehicle.TANK_SIZE_PASSENGER_CAR*amount){


                switch (brand){
                case VehicleBrand.AUDI://AUDI
                    if (this.audiStock>=amount){
                        this.audiStock = this.audiStock - amount;
                        this.gasStockLiters = this.gasStockLiters - Vehicle.TANK_SIZE_PASSENGER_CAR*amount;
                        this.passengerCarsStock = this.passengerCarsStock - amount;
                        sold=true;
                    } else {
                        System.err.println("Nicht genug AUDI oder Benzin vorhanden");
                    }
                    break;
                case VehicleBrand.BMW://BMW
                    if(this.bMWStock>=amount){
                        this.bMWStock = this.bMWStock -amount;
                        this.gasStockLiters = this.gasStockLiters - Vehicle.TANK_SIZE_PASSENGER_CAR*amount;
                        this.passengerCarsStock = this.passengerCarsStock - amount;
                        sold=true;
                    } else {
                        System.err.println("Nicht genug BMW oder Benzin vorhanden");
                    }
                    break;
                case VehicleBrand.MERCEDES://MERCEDES
                    if (this.mercedesStock>=amount){
                        this.mercedesStock = this.mercedesStock - amount;
                        this.gasStockLiters = this.gasStockLiters - Vehicle.TANK_SIZE_PASSENGER_CAR*amount;
                        this.passengerCarsStock = this.passengerCarsStock - amount;
                        sold=true;
                    } else {
                        System.err.println("Nicht genug Mercedes oder Benzin vorhanden");
                    }
                    break;
                case VehicleBrand.OPEL://OPEL
                    if(this.opelStock>=amount){
                        this.opelStock = this.opelStock -amount;
                        this.gasStockLiters = this.gasStockLiters - Vehicle.TANK_SIZE_PASSENGER_CAR *amount;
                        this.passengerCarsStock = this.passengerCarsStock - amount;
                        sold=true;
                    } else {
                        System.err.println("Nicht genug Opel oder Benzin vorhanden");
                    }
                    break;
                }       
                    if (sold=true){
                        for (int i=0; i<amount; i++){
                            soldCar[i]=new Vehicle(VehicleType.PASSENGER_CAR);
                        }
                    System.out.println("Fahrzeug(e) erfolgreich verkauft"); 
                    }
                    if (sold=false) {
                        for (int i=0; i<amount; i++){
                        soldCar[i]=null;
                        }
             }
           }
        }
                return soldCar;


    }

    public boolean fillGas(float gas){

        boolean filled=false;

        if((gasStockLiters + gas)<=CarTrader.CAPACITY_GAS_LITERS){

            gasStockLiters = gasStockLiters + gas;
            filled=true;
        }
            else{
                System.err.println("Die Kapazität beträgt höchstens 180 Liter");
            }
        return filled;
        }

    public boolean fillDiesel(float diesel){

        boolean  filled2=false;

        if((dieselStockLiters + diesel)<=CarTrader.CAPACITY_DIESEL_LITERS){

            dieselStockLiters = dieselStockLiters + diesel; 
            filled2=true;
        }

            else{
                System.err.println("Die Kapazität beträgt höchstens 250 Liter");
            }
        return filled2;
    }


     public abstract void isSoldVehicle();

    void statusOutput()
    {
        System.out.println("AutoHändler - Lagerbestand:");
        System.out.println("    PKW: " + passengerCarsStock);
        System.out.println("Audi: " +this.audiStock);
        System.out.println("BMW: "+ this.bMWStock);
        System.out.println("Mercedes: "+ this.mercedesStock);
        System.out.println("Opel: "+ this.opelStock);
        System.out.println("LKWHändler - Lagerbestand");
        System.out.println("    LKW: " + trucksStock);
        System.out.println("MAN: "+ this.mANStock);
        System.out.println("Scania "+this.scaniaStock);
        System.out.println("Kraftstoff Lagerbestand:");
        System.out.println("    - Diesel: " + dieselStockLiters);
        System.out.println("    - Benzin: " + gasStockLiters);
    }
}

PassengerCarTrader 

    public class PassengerCarTrader extends CarTrader {





        public static final int CAPACITY_AUDI = 4;
        public static final int CAPACITY_BMW = 4;
        public static final int CAPACITY_OPEL = 4;
        public static final int CAPACITY_MERCEDES = 3;


            void setGasStockLiters(float gasStockLiters){
                this.gasStockLiters=gasStockLiters;
            }
            void setPassengerCarsStock(int passengerCarsStock){
                this.passengerCarsStock=passengerCarsStock;
            }

            int getPassengerCarsStock(){
                return passengerCarsStock;
            }

            float getGasStockLiters(){
                return gasStockLiters;
            }
            void setMercedesStock(int mercedesStock){
                this.mercedesStock=mercedesStock;
            }
            void setBMWStock(int bMWStock){
                this.bMWStock=bMWStock;
            }
            void setAudiStock(int audistock){
                this.audiStock=audistock;
            }
            void setOpelStock(int opelstock){
                this.opelStock=opelstock;
            }
            int getMercedesStock(){
                return mercedesStock;
            }
            int getBMWStock(){
                return bMWStock;
            }
            int getOpelStock(){
                return opelStock;
            }
            int getAudiStock(){
                return audiStock;
            }



            public boolean reorderVehicles(int amountVehicles, int brand){

                boolean full=false;

                if((passengerCarsStock+amountVehicles)<=CAPACITY_PASSENGER_CARS){

                    switch (brand){
                    case VehicleBrand.AUDI: 
                        if ((this.audiStock+amountVehicles)<=CAPACITY_AUDI){
                            this.audiStock += amountVehicles;
                        }
                        break;
                    case VehicleBrand.BMW:
                        if((this.bMWStock+amountVehicles)<=CAPACITY_BMW){
                            this.bMWStock += amountVehicles;
                        }
                        break;
                    case VehicleBrand.MERCEDES:
                        if((this.mercedesStock+amountVehicles)<=CAPACITY_MERCEDES){
                            this.mercedesStock += amountVehicles;
                        }
                        break;
                    case VehicleBrand.OPEL:
                        if((this.opelStock+amountVehicles)<=CAPACITY_OPEL){
                            this.opelStock += amountVehicles;
                        }
                        break;
                    default: 
                        System.err.println("Ungültige Eingabe");

                        break;
                    }
                    passengerCarsStock += amountVehicles;
                    full=true;
                }
                return full;
            }

            public void isSoldVehicleType(byte type){
                if (type==VehicleType.TRUCK){
                    System.out.println("Es handelt sich um einen Truck");
                }
                if (type==VehicleType.PASSENGER_CAR){
                    System.out.println("Es handelt sich um einen PKW");
                }
            }

            public boolean checkAvailability (int brand, int amount){

                boolean available=false;

                switch (brand){
                case VehicleBrand.AUDI: if(this.audiStock>=amount){
                    System.out.println("Die gewünschte Menge ist verfügbar");
                    available=true;
                } else {
                    System.out.println("Die gewünschte Menge ist nicht verfügbar");
                }
                case VehicleBrand.BMW: if(this.bMWStock>=amount){
                    System.out.println("Die gewünschte Menge ist verfügbar");
                    available=true;
                } else {
                    System.out.println("Die gewünschte Menge ist nicht verfügbar");
                }
                case VehicleBrand.MERCEDES: if(this.mercedesStock>=amount){
                    System.out.println("Die gewünschte Menge ist verfügbar");
                    available=true;
                } else {
                    System.out.println("Die gewünschte Menge ist nicht verfügbar");
                }
                case VehicleBrand.OPEL: if(this.opelStock>=amount){
                    System.out.println("Die gewünschte Menge ist verfügbar");
                    available=true;
                } else {
                    System.out.println("Die gewünschte Menge ist nicht verfügbar");
                }
                default:
                    System.err.println("Bitte wählen Sie 1 bis 4");
                }
                return available;
            }
    }

TruckTrader

    public class TruckTrader extends CarTrader{

    public static final int CAPACITY_MAN = 4;
    public static final int CAPACITY_SCANIA = 4;




     void setDieselStockLiters(int dieselStockLiters){
         this.dieselStockLiters=dieselStockLiters;
     }
     void setTrucksStock(int trucksStock){
         this.trucksStock=trucksStock;
     }
     void setMANStock(int mANStock){
         this.mANStock=mANStock;
     }
     void setScaniaStock(int scaniaStock){
         this.scaniaStock=scaniaStock;
     }
     float getDieselStockLiters(){
         return dieselStockLiters;
     }
     int getTrucksStock(){
         return trucksStock;
     }

     int getMANStock(){
         return mANStock;
     }
     int getScaniaStock(){
         return scaniaStock;
     }


     public boolean reorderVehicles(int amountVehicles, int brand){

            boolean full=false;

            if((trucksStock+amountVehicles)<=CAPACITY_TRUCKS){

                switch (brand){
                case VehicleBrand.MAN: 
                    if ((this.mANStock+amountVehicles)<=CAPACITY_MAN){
                        this.mANStock += amountVehicles;
                    }
                    break;
                case VehicleBrand.SCANIA:
                    if((this.scaniaStock+amountVehicles)<=CAPACITY_SCANIA){
                        this.scaniaStock += amountVehicles;
                    }
                    break;

                default: 
                    System.err.println("Ungültige Eingabe");
                    break;
                }
                trucksStock += amountVehicles;
                full=true;
            }
            return full;
        }

     public void isSoldVehicleType(byte type){
            if (type==VehicleType.TRUCK){
                System.out.println("Es handelt sich um einen Truck");
            }
            if (type==VehicleType.PASSENGER_CAR){
                System.out.println("Es handelt sich um einen PKW");
            }
        }

     public boolean checkAvailability (int brand, int amount){

            boolean available=false;

            switch (brand){
            case VehicleBrand.MAN: if(this.mANStock>=amount){
                System.out.println("Die gewünschte Menge ist verfügbar");
                available=true;
            } else {
                System.out.println("Die gewünschte Menge ist nicht verfügbar");
            }
            case VehicleBrand.SCANIA: if(this.scaniaStock>=amount){
                System.out.println("Die gewünschte Menge ist verfügbar");
                available=true;
            } else {
                System.out.println("Die gewünschte Menge ist nicht verfügbar");
            }

            }
            return available;
        }


}

VehicleBrand

    public final class VehicleBrand {

    public static final int AUDI = 1;
    public static final int BMW = 2;
    public static final int OPEL = 3;
    public static final int MERCEDES = 4;

    public static final int MAN = 1;
    public static final int SCANIA = 2;

     //This class is just an organizer for the above constants; Not instantiable.

    private VehicleBrand(){
    }
}

VehicleType

    public final class VehicleType {

    public static final byte PASSENGER_CAR = 7;

    public static final byte TRUCK = 5;


    /**
     * This class is just an organizer for the above constants; Not instantiable.
     */
    private VehicleType(){

    }

}

Vehicle

    public class Vehicle {
    public static final float TANK_SIZE_PASSENGER_CAR = 40.f;
    public static final float TANK_SIZE_TRUCK = 80.f;
    public float fuel;
    public byte mVehicleType;
    public int brand;

    public Vehicle(){}

    public Vehicle(byte vehicleType){
        this();
        if (vehicleType == VehicleType.PASSENGER_CAR){
            this.mVehicleType= VehicleType.PASSENGER_CAR ;
            this.fuel= Vehicle.TANK_SIZE_PASSENGER_CAR;

        }

        if(vehicleType == VehicleType.TRUCK){
            this.mVehicleType= VehicleType.TRUCK;
            this.fuel= Vehicle.TANK_SIZE_TRUCK;

        }
    }

    public float getFuel(){
        return this.fuel;
    }

    public byte getVehicleType(){
        return this.mVehicleType;
    }
}

最佳答案

两个子类都有一个如下所示的方法:

public boolean checkAvailability(int brand, int amount) {
    // .....
}

如果你想使用父类的变量并让它们调用这个方法,那么父抽象类也必须声明这个方法。它可以是一个抽象方法,因为子类已经实现了它,但它必须存在,并且还要理解这是不够的:

public abstract void checkAvailability();

因为方法签名必须完全匹配,包括返回类型和参数。你的父类中必须有这样的东西:

public abstract boolean checkAvailability(int brand, int amount);

你看到区别了吗,包括返回类型和参数?您的编译器是严格且无情的,因此您编码器也必须如此。

完成此操作后,在您的子类上方添加一个 @Override 注释,以确保覆盖正确完成。

<小时/>

还有这个:

CarTrader trader1 = passengerCarTrader;

无法编译。它需要更像是:

CarTrader trader1 = New PassengerCarTrader();

同样,您的编译器不会容忍马虎,因此您必须努力在编码和问题中避免马虎。

<小时/>

将来,请尝试将您的代码和问题简化到最低限度以演示您的问题。对于这个问题,您所需要的只是:

public class TestCars {
    public static void main(String[] args) {
        CarTrader trader1 = new PassengerCarTrader();
        if (trader1.checkAvailability(3, 1));
    }
}

public abstract class CarTrader {
    public abstract void checkAvailability(); 
}

public class PassengerCarTrader extends CarTrader {
    public boolean checkAvailability(int brand, int amount) {
        boolean availability = false;
        // .....

        return availability;
    }
}

这显然不能编译,而这个可以:

public class TestCars {
    public static void main(String[] args) {
        CarTrader trader1 = new PassengerCarTrader();
        if (trader1.checkAvailability(3, 1));
    }
}

abstract class CarTrader {
    public abstract boolean checkAvailability(int brand, int amount); 
}

class PassengerCarTrader extends CarTrader {
    @Override
    public boolean checkAvailability(int brand, int amount) {
        boolean availability = false;
        // .....

        return availability;
    }
}

关于java - 无法在我的车辆交易程序中销售卡车和 1 个 JUnit 错误(缺少抽象方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49949662/

相关文章:

java - 未知的 Java 结果消息

java - 字段上的 CDI @Produces 注释的目的是什么?

java - 这个异常类是做什么的?

java - Spring Security 拒绝所有用户

java - 无法获取卫星数 Android

java - 不违反更改列表中的 "compareTo"契约(Contract)

java - 我可以将 LatLng 对象用作 double 对象吗?

java - 解析 DecimalFormat 以避免科学计数法

java - 从接口(interface)继承的spring注入(inject)bean

java - 在java类中制作卡片组