Наследование приватных переменных - PullRequest
0 голосов
/ 24 июня 2018

Я уверен, что об этом уже спрашивали, но я не смог найти однозначного ответа на свой вопрос.Скажем, у нас было два следующих класса:

public abstract class Vehicle {
    private int gasTank;
    private int milesDriven;

    void Vehicle(int gas, int milesDriven) {
        gasTank = gas;
        this.milesDriven = milesDriven;
    }

    void move(int miles) {
        gasTank -= subclass.getMileage() * miles;  // I know this doesn't work but bear with me
        milesDriven += miles;
    }
}

public class HyundaiSonata extends Vehicle {
    private int mileage;

    void HyundaiSonata () { super(40, 5000); }

    int getMileage() {return mileage;}
}

По сути, мой вопрос находится на 11-й строке. Нет способа получить доступ к методам или полям подкласса, поскольку наследование только возрастает, так как мне структурировать это иначе??

Изменить: Обратите внимание, что решение должно работать для общего случая, когда у меня есть сотни различных транспортных средств, расширяющих класс транспортных средств

Ответы [ 4 ]

0 голосов
/ 24 июня 2018

Вы можете заставить подклассы реализовывать метод getMileage, сделав его abstract. Таким образом, подклассы должны реализовывать только поведение, неизвестное классу Vehicle, не известное / отделенное от логики метода move. Это должно выглядеть примерно так.

public abstract class Vehicle {
    private int gasTank;
    private int milesDriven;

    Vehicle(int gas, int milesDriven) {
        gasTank = gas;
        this.milesDriven = milesDriven;
    }

    void move(int miles) {
        gasTank -= this.getMileage() * miles;
        milesDriven += miles;
    }

    abstract int getMileage()
}

public class HyundaiSonata extends Vehicle {
    HyundaiSonata () { super(40, 5000); }

    @Override
    int getMileage() {
        return 5;
    }
}
0 голосов
/ 24 июня 2018

Добавить

protected abstract int getMileage();

В суперклассе и подклассе необходимо переопределить его

0 голосов
/ 24 июня 2018

Должно быть:

public abstract class Vehicle {
    private int gasTank;
    private int milesDriven;

    void Vehicle(int gas, int milesDriven) {
        gasTank = gas;
        this.milesDriven = milesDriven;
    }

    protected abstract int getMileage(); // Introduce this abstract method

    void move(int miles) {
        gasTank -= subclass.getMileage() * miles;  
        milesDriven += miles;
    }
}

public class HyundaiSonata extends Vehicle {
    private int mileage;

    void HyundaiSonata () { super(40, 5000); }

    @Override 
    public int getMileage() {return mileage;}
}
0 голосов
/ 24 июня 2018

Вам необходимо переопределить ваш метод перемещения в дочернем классе.Сделайте ваш метод перемещения абстрактным в родительском классе.

Один из способов, по которому я могу поспорить об этом, - позволить классу Vehicle иметь много дочерних классов, в этом случае вы не сможете написать свой метод перемещения вКласс транспортного средства, поскольку вы не могли знать, какой пробег подкласса использовать.

Так вот исправленный код.

public abstract class Vehicle {
    private int gasTank;
    private int milesDriven;

    void Vehicle(int gas, int milesDriven) {
        gasTank = gas;
        this.milesDriven = milesDriven;
    }
    // make this function abstract
    abstract void move(int miles); 

}

public class Hyundai Sonata extends Vehicle {
    private int mileage;

    void Hyundai Sonata () { super(40, 5000); }

    void getMileage() {return mileage;}
    //override it here
    @Override
    public void move(int miles){
    gasTank -=this.getMileage() * miles;
        milesDriven += miles; 
    }

}

Изменить 1: -

Как указаноу вас в комментарии есть способ решить эту проблему.

Сделать переменную пробега сущностью класса транспортного средства.

Таким образом, ваш класс транспортного средства будет выглядеть как

public abstract class Vehicle {
    private int gasTank;
    private int milesDriven;
    private int mileage;
    void Vehicle(int gas, int milesDriven,int mileage) {
        gasTank = gas;
        this.milesDriven = milesDriven;
        this.mileage=mileage;
    }
    public void move(int miles){
     gasTank -=mileage * miles;
    milesDriven += miles; 
}


}

И ваш подкласс будет выглядеть так.

 public class Hyundai Sonata extends Vehicle {
        private int mileage;

        void Hyundai Sonata () { super(40, 5000,mileage); }



        }

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