Подкласс редактирует объявленные абстрактные классы. - PullRequest
2 голосов
/ 28 января 2020

У меня есть абстрактный класс, который будет наследоваться подклассами. Я хочу иметь метод get, который возвращает количество пассажиров. Я объявляю этот метод в абстрактном классе, и он будет возвращать пассажиров.

Член класса passengers не определен, но создан, поэтому метод get знает, какую переменную нужно вернуть.

В подклассах я хочу, чтобы эта переменная имела разные значения.

Однако метод get возвращает 0, даже если количество пассажиров не равно 0.

Я попытался написать: passengers = random.nextInt(4) + 1;

Автомобиль абстрактного класса

import java.util.Random;

public abstract class Vehicle {
    protected Random random = new Random();
    protected int passengers;

    public int getPassengerAmount() {
        return this.passengers;
    }
}

Автомобиль класса

public class Car extends Vehicle {
    private String name = "Car";
    private int size = 1;
    public int passengers = random.nextInt(4) + 1;
}

Ответы [ 4 ]

2 голосов
/ 28 января 2020

Вы маскируете родительскую переменную путем повторного выделения переменной passengers в классе Car.

Вместо этого следует инициализировать родительскую переменную в конструкторе дочернего элемента:

public class Car extends Vehicle {

    private String name = "Car";
    private int size = 1;

    public Car() {
        this.passengers = random.nextInt(4) + 1;
    }

}

Если вы хотите, чтобы он был опубликован c, то вы должны сделать его опубликованным c в классе Vehicle, но, если честно, я бы не рекомендовал его, и я бы предпочел go с защищенными переменными, но publi c геттеры / сеттеры.

0 голосов
/ 28 января 2020
public class Car extends Vehicle {
    private String name = "Car";
    private int size = 1;
    public int passengers = random.nextInt(4) + 1; // this is not passengers of the superclass
    void setPassengers() { passengers = random.nextInt(4) + 1; } // this is passengers of the superclass
}
0 голосов
/ 28 января 2020

Ответом на ваш вопрос будет то, что вы инициализируете переменную пассажиров напрямую. Вы должны создать конструктор для него и назначить значение по умолчанию там. Кроме того, вам не нужно снова создавать переменную publi c в подклассе, в противном случае абстрактный класс не имеет смысла существовать. Обратите внимание, что абстрактный класс должен иметь абстрактную функцию.

0 голосов
/ 28 января 2020

Вы не используете правильный подход для расчета количества пассажиров в определенном транспортном средстве.

Приятно иметь ваш Vehicle в качестве абстрактного класса, поскольку он будет иметь только общие характеристики c, которые все Vehicle делятся и позволяют специфике каждого из них реализовываться в соответствующих классах.

Для Car. Вы должны реализовать ваше c представление о том, сколько пассажиров должно быть в Car. Таким образом, getPassengerAmount() должен быть объявлен abstract в вашем Vehicle и реализован в каждом конкретном c транспортном средстве.

Это означает:

import java.util.Random;

public abstract class Vehicle {
protected Random random = new Random();
protected int passengers;

public Vehicle() {
   initializeVehiculeOptions();  
}

public abstract int initializeVehiculeOptions();    
}

и

import java.util.Random;

public class Car extends Vehicle {

     private String name = "Car";
     private int size = 1;

     public Car() {
          super();
     }

     @Override
     public int initializeVehiculeOptions() {
          // Here you initialize for 
          this.passengers = random.nextInt(4) + 1;
     }
}

Вы будете использовать Car экземпляр

Car ford = new Car();
...