Java - поле в родительском классе не изменяется - PullRequest
0 голосов
/ 03 ноября 2018

Итак, у меня есть переменная в родительском классе, которую я пытаюсь изменить в подклассе с помощью методов getter / setter. Но ценность остается неизменной, и я понятия не имею, почему .. Что я делаю не так? Любая помощь приветствуется!

  • Вот разбивка программы: в классе драйвера вы выбираете, что вы хотите сделать, затем он использует переменную текущего значения и число, которое вы выбираете (операнд2), чтобы получить ответ. Сложение, вычитание, умножение и деление находятся в классе калькулятора памяти. Также можно очистить, что устанавливает переменную текущего значения в ноль. Теперь мы добавляем к нему подкласс, который выполняет экспоненты и логарифмы.

  • особенности: переменная currentValue в классе MemoryCalc остается той же самой, когда я пытаюсь использовать методы power или log в классе ScientificMemCalc. В этом классе он использует метод получения, чтобы получить текущее значение, а затем пытается использовать метод установки, чтобы изменить текущее значение. Но ничего не меняется. И еще одна проблема: метод get получает нулевое значение из поля currentValue.

Вот класс драйвера с методом main:

package ScientificMemCalc;

import java.util.Scanner;

import ScientificMemCalc.MemoryCalc;

public class ScientificCalcDriver {

    public static void main(String[] args) {

    Scanner input = new Scanner(System.in);

    MemoryCalc calculator = new MemoryCalc();
    ScientificMemCalc scientificCalc = new ScientificMemCalc();


    int menu = 0;
    double operand2, answer;

    while (menu !=8) {

        answer = calculator.getCurrentValue();
        System.out.println("The current value is: " + answer);  

        menu = getMenuOption();

        switch(menu) {
        case 1:
            // Add
            operand2 = calculator.getOperand("What is the second number?: ");
            calculator.add(operand2);
            break;

        case 2:
            // Subtract
            operand2 = calculator.getOperand("What is the second number?: ");
            calculator.subtract(operand2);
            break;

        case 3:
            // Multiply
            operand2 = calculator.getOperand("What is the second number?: ");
            calculator.multiply(operand2);
            break;

        case 4:
            // Divide
            operand2 = calculator.getOperand("What is the second number?: ");
            calculator.divide(operand2);
            break;

        case 5:
            // Power
            operand2 = calculator.getOperand("What is the second number?: ");
            scientificCalc.power(operand2);
            break;

        case 6:
            // Logarithm
            scientificCalc.log();
            break;

        case 7:
            // Clear
            operand2 = 0;
            calculator.clear();
            break;

        case 8:
            // Quit
            System.out.println("Goodbye!");
            break;
        }
    }
}

public static int getMenuOption() {

    Scanner input = new Scanner(System.in); 

    int choice = 0;

    // Display menu
    System.out.println("Menu:");
    System.out.println("1. Add");
    System.out.println("2. Subtract");
    System.out.println("3. Multiply");
    System.out.println("4. Divide");
    System.out.println("5. Power");
    System.out.println("6. Logarithm");
    System.out.println("7. Clear");
    System.out.println("8. Quit");

    // Get menu input
    System.out.print("What would you like to do?: ");
    choice = input.nextInt();

    while (choice < 1 || choice > 8) {
        System.out.print("Invalid. Try again: ");
        choice = input.nextInt();
    }

    return choice;
    }
}

Вот класс калькулятора памяти:

package ScientificMemCalc;

import java.util.Scanner;

public class MemoryCalc {

private double currentValue;

public double getOperand(String prompt) {

    Scanner input = new Scanner(System.in);

    System.out.print(prompt);
    return input.nextDouble();

}
public double getCurrentValue() {
    return currentValue;
}
public void setCurrentValue(double temp) {
    currentValue = temp;
}
public void add(double operand2) {
    // Add
    currentValue += operand2;
}
public void subtract(double operand2) {
    // Subtract
    currentValue -= operand2;
}
public void multiply(double operand2) {
    // Multiply
    currentValue *= operand2;
}
public void divide(double operand2) {
    // Divide
    if (operand2 == 0) {
        System.out.println("You cannot divide by zero!");
        currentValue = Double.NaN;
    }
    else {
        currentValue /= operand2;
    }
}
public void clear() {
    // Clear
    currentValue = 0;

    }
}

И, наконец, подкласс для добавления научных функций:

package ScientificMemCalc;

public class ScientificMemCalc extends MemoryCalc {

public void power(double operand2) {
    // Power
    double currentValue = getCurrentValue();
    double temp = Math.pow(currentValue, operand2);
    setCurrentValue(temp);
}
public void log() {
    // Logarithm
    double currentValue = getCurrentValue();
    double temp = Math.log(currentValue);
    setCurrentValue(temp);
    }

}

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Краткий ответ

Вы взаимодействуете с ДВА РАЗЛИЧНЫХ ОБЪЕКТА calculator и scientificCalc. Они не делят ни одного государства.

Что вы можете сделать?

  1. Используйте scientificCalc для всех расчетов. Таким образом, значение будет одним и единственным.

минусы : все может стать намного сложнее, если вы введете калькулятор другого типа

  1. Передать calculator конструктору ScientificMemCalc в качестве параметра конструктора.

минусы : то же, что и для # 1

  1. Используйте отдельный класс / объект для хранения состояния. (как предложено @ user2864740)

  2. Не сохраняйте состояние внутри калькулятора (зачем вам это нужно?). Передайте все операнды (текущее состояние всегда будет операндом # 1) методам и верните результат вызывающей стороне:

    int menu = 0;
    double operand2, answer;
    while (menu !=8) {
    
        // You don't need this line
        //answer = calculator.getCurrentValue();
    
        System.out.println("The current value is: " + answer);  
    
        menu = getMenuOption();
    
        switch(menu) {
        case 1:
            // Add
            operand2 = calculator.getOperand("What is the second number?: ");
            // 
            answer = calculator.add(answer, operand2);
            break;
            //... modify other operations in the same way
    }
    
0 голосов
/ 03 ноября 2018

В классе ScientificMemCalc вы расширяете MemoryCalc, это позволяет ScientificMemCalc вызывать методы, созданные в MemoryCalc, и обеспечивает доступ к собственному набору переменных в MemoryCalc. Однако при создании двух отдельных объектов каждого класса у них обоих будет доступ к переменной с одинаковым именем и типом, но они будут двумя отдельными переменными в двух отдельных объектах.

Одно решение - передать объект MemoryCalc в конструктор класса ScientificMemCalc, а затем вызвать методы getCurrentValue () / setCurrentValue () для этого объекта. Разрешение доступа к той же переменной.

package scientificMemCalc;

public class ScientificMemCalc {

    //store the MemoryCalc object so we have access to the needed data
    private MemoryCalc memCalc;

    //store the MemoryCalc
    public ScientificMemCalc(MemoryCalc memCalc) {
        this.memCalc = memCalc;
    }

    public void power(double operand2) {

        // Power
        double currentValue = memCalc.getCurrentValue();
        double temp = Math.pow(currentValue, operand2);
        memCalc.setCurrentValue(temp);

    }

    public void log() {

        // Logarithm
        double currentValue = memCalc.getCurrentValue();
        double temp = Math.log(currentValue);
        memCalc.setCurrentValue(temp);

    }

}

Затем при создании экземпляра объекта ScientificMemCalc передайте ссылку на ваш MemoryCalc.

MemoryCalc calculator = new MemoryCalc();
ScientificMemCalc scientificCalc = new ScientificMemCalc(calculator);

Надеюсь, это поможет!

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