Кто-нибудь может указать, почему мое поле выдает ошибки? - PullRequest
0 голосов
/ 05 августа 2020

В настоящее время я работаю над небольшим проектом, чтобы улучшить свои Java навыки, и остановился на небольшом проекте, который проверяет вашу способность разрабатывать и реализовывать классы Java для моделирования и управления данными. Мне нужно создать классы для управления коллекцией заказов на аренду автомобилей для компании по аренде автомобилей. Мне нужно разработать классы, используя иерархию наследования и соответствующие типы коллекций из Java Collections Framework (JCF).

До сих пор я создал свой первый класс, который является классом Vehicle, который моделирует транспортное средство для наем, и второй класс, который моделирует аренду автомобиля.

У меня небольшие проблемы с тем, чтобы мои классы разговаривали друг с другом, и я надеялся, что кто-то может указать мне правильное направление. Мой класс транспортного средства в порядке и не содержит ошибок, проблема заключается в классе аренды, где я, похоже, не могу правильно настроить поле «Транспортное средство». Ниже приведен код для двух моих классов.

Заранее большое спасибо за любую помощь

//Import the comparator 
import java.util.Comparator;


//Task 1 - Vehicle Class

   


        public class Vehicle {

    //Private string field that stores the name of the vehicle
    //Private double field that stores the cost per day for vehicle hire
    private String modelName;
    private double dailyCost;

    //Constructor for vehicle with two fields using two parameters
    public Vehicle(String Modelname, double dailyCost) {
        this.modelName = modelName;
        this.dailyCost = dailyCost;
    }

    //Getter for model name
    public String getModelname() {
        return modelName;
    }

    //Setter for model name
    public void setModelName() {
        this.modelName = modelName;
    }

    //Getter for daily cost
    public double getDailyCost() {
        return dailyCost;
    }

    //Setter for daily cost
    public void setDailyCost() {
        this.dailyCost = dailyCost;
    }

    @Override
    //Return details as formatted String 
    public String toString(){
       String result = "Vehicle: " + this.getModelname()+ " £" + this.getDailyCost() + " per day\n";
       return result;
    }
    
    
    
}




//Task 2 - Abstract Hire class

        public abstract class Hire {

    //Private field of type vehicle to store the vehicle on hire
    //Private int to store the duration of hire in days 
    private int days;
    //Need to declare this field properly later 
    private Vehicle aVehicle = new Vehicle(String modelName, double dailyCost);
    
    
    //Constructor for the Hire with two fields and two parameters
    public Hire(String vehicle, int days) {
        this.vehicle = vehicle;
        this.days = days;
    }

    //Getter for model days
    public int getDays() {
        return days;
    }

    //Setter for model days
    public void setdays() {
        this.days = days;
    }
    
    //Getter for model vehicle
    public String getVehicle() {
        return vehicle;
    }

    //Setter for model vehicle
    public void setVehicle() {
        this.vehicle = vehicle;
    }
    
    //Method to calculate the total cost of hire 
    public double getCost(){
        return (days * dailyCost);
    }
    
    
    //Think this is in the right place?
    @Override
    //Method to return the details of Hire as a string 
    public String toString(){
        String result = ("Vehicle: " + this.modelName()+ this.dailyCost + " per day. Days: " + this.getDays + " Hire Cost: " + this.getCost );
       return result;
    }
    
}

Ответы [ 5 ]

0 голосов
/ 05 августа 2020

Прежде всего ваш конструктор в классе 'Vehicule' неверен

public Vehicle(String Modelname, double dailyCost) {
        this.modelName = modelName;
        this.dailyCost = dailyCost;
    }

Параметр ' String Modelname ' записан с большой буквы M, но имя модели ' ', которое вы даете' this.modelname ', на самом деле является свойством класса, как будто вы это делаете: this.modelName=this.modelName Это означает, что вы не добавляете к нему ничего нового

Во-вторых, зачем ваш класс 'Hire' будет абстрактным, если вы хотите его использовать? абстрактный класс не может быть инициализирован.

Я также обнаружил две основные ошибки в этом классе:

  1. private Vehicle aVehicle = new Vehicle(String modelName, double dailyCost); Здесь вы должны сначала объявить String 'modelname' и double 'dailyCost' и присвоить им значение перед созданием вашего объекта aVehicle.

-Или просто сделайте это вместо: Vehicle aVehicle = new Vehicle("Volkswagen",42069);

ваши геттеры и сеттеры для Vehicule неверны, потому что вы указали свойство Vehicle как aVehicle с буквой 'a', а не ' Vehicule '

Вместо этого ваши геттеры и сеттеры должны быть такими:

 public String getaVehicle() {
      return aVehicle;
  }

  //Setter for model vehicle
  public void setaVehicle(Vehicle aVehicle) {
      this.aVehicle = aVehicle;
  }

Наконец, ваш метод toString в этом классе неверен из-за той же ошибки инициализации, вы не объявили modelName и dailycost объектов в вашем классе Hire . Теперь, если вы хотите наследование между двумя классами, вы должны сделать следующее:

public class Hire extends Vehicle {
...
}

Это наследование означает, что ваш дочерний класс 'Нанять' класс будет ' унаследовать 'все атрибуты и методы от вашего родительского класса Vehicle , поэтому вам не придется снова объявлять атрибуты modelname и dailycost в классе Hire, потому что они уже присутствуют в класс вашего автомобиля.

0 голосов
/ 05 августа 2020

Попробуйте изменить:

  • private Vehicle aVehicle = new Vehicle(String modelName, double dailyCost); на private Vehicle aVehicle = new Vehicle("", (Double) 0); или null, потому что вам нужно создать что-то, а не передать конструктору;

  • public Hire(String vehicle, int days) { с public Hire(Vehicle vehicle, int days) {, потому что вам нужен класс Vehicle, а не String;

  • this.vehicle = vehicle; до this.aVehicle = vehicle;, потому что aVehicle - это имя переменной в классе Hire.

0 голосов
/ 05 августа 2020

Я использую Lambda для создания найма объекта instace для расширения абстрактного класса Hire и перезаписи метода установки / получения. Теперь это работает.

Класс найма:

public abstract class Hire {
    //Private field of type vehicle to store the vehicle on hire
    //Private int to store the duration of hire in days
    private int days;
    private String vehicle;

    private int dailyCost;
    //Need to declare this field properly later
    private Vehicle aVehicle;

    // a blank Constructor
    public Hire(){

    }

    //Constructor for the Hire with two fields and two parameters
    public Hire(String vehicle, int days) {
        this.vehicle = aVehicle.getModelname();
        this.days = days;
    }

    //Getter for model days
    public int getDays() {
        return days;
    }

    //Setter for model days
    public void setdays() {
        this.days = days;
    }

    //Getter for model vehicle
    public String getVehicle() {
        return vehicle;
    }

    //Setter for model vehicle
    public void setVehicle(Vehicle vehicle) {
        this.vehicle = vehicle.getModelname();
    }

    //Method to calculate the total cost of hire
    public double getCost(){
        return (days * dailyCost);
    }


    //Think this is in the right place?
    @Override
    //Method to return the details of Hire as a string
    public String toString(){
        String result = ("Vehicle: " + this.aVehicle.getModelname()+ this.dailyCost + " per day. Days: " + this.getDays() + " Hire Cost: " + this.getCost() );
        return result;
    }
}

Класс теста:

public class Test {
    public static void main(String[] args){
        Vehicle vehicle = new Vehicle("Driver",100);
        Hire hire = new Hire() {
            @Override
            public int getDays() {
                return super.getDays();
            }

            @Override
            public void setVehicle(Vehicle vehicle) {
                super.setVehicle(vehicle);
            }

            @Override
            public String getVehicle() {
                return super.getVehicle();
            }
        };

        hire.setVehicle(vehicle);
        System.out.println("Vehivle Class Name: " + vehicle.getModelname());

        System.out.println("Abstract Hire Class Name: " + hire.getVehicle());
    }
}

Результат:

Vehivle Class Name: Driver
Abstract Hire Class Name: Driver
0 голосов
/ 05 августа 2020

Как сказал @ tobias-k: new Vehicle(String modelName, double dailyCost); недействителен. Вы можете передать экземпляр Vehicle с помощью конструктора Hire

private Vehicle vehicle;

public Hire(Vehicle vehicle, int days) {
    this.vehicle = vehicle;
    this.days = days;
}

Дополнительно я исправил эти методы:

public Vehicle getVehicle() { //Valid return type
    return vehicle;
}

public void setVehicle(Vehicle vehicle) { //Pass vehicle instance to set as this.vehicle value
    this.vehicle = vehicle;
}

public void setdays(int days) { //Pass int valueto set as this.days value
    this.days = days;
}

public double getCost(){
    return (days * this.vehicle.getDailyCost()); //Valid get dailyCost via Vehicle getter
}

@Override
public String toString() { //Accesses via getters and formatted
    return "Vehicle: " + this.vehicle.getModelname() + this.vehicle.getDailyCost() +
            " per day. Days: " + this.days + " Hire Cost: " + this.getCost();
}

Исправления для класса Vehicle:

  1. (modelName опечатка)

вместо:

public Vehicle(String Modelname, double dailyCost) {
        this.modelName = modelName;
        this.dailyCost = dailyCost;
    }

используйте:

public Vehicle(String modelName, double dailyCost) {
    this.modelName = modelName;
    this.dailyCost = dailyCost;
}

2. (отсутствие String modelName)

вместо:

public void setModelName() {
    this.modelName = modelName;
}

используйте:

public void setModelName(String modelName) {
    this.modelName = modelName;
}

3. (отсутствие `double dailyCost`)

вместо:

public void setDailyCost() {
    this.dailyCost = dailyCost;
}

используйте:

public void setDailyCost(double dailyCost) {
    this.dailyCost = dailyCost;
}
0 голосов
/ 05 августа 2020

Вам необходимо передать конструктору Vehicle внутри Hire фактические значения, например:

new Vehicle("Toyota", 100);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...