Метод класса моего родителя не получает значение переменной моего экземпляра - PullRequest
0 голосов
/ 14 апреля 2020

Я делаю толстый калькулятор процента и расширяю мужской калькулятор, так как он имеет в основном ту же функциональность. Что происходит, я не добавляю метод вычисления жира из женского класса (родителя), чтобы попытаться сохранить некоторый код, но когда я создаю экземпляр мужского класса и использую метод жира, он не получает значение, которое я получил от метода в мужском классе. Если вы можете объяснить, почему я буду действительно признателен за это.


public class DC_Calculator_Women implements DC_Fat_Calculator{
   private int age;
   private int total_Pliegues;
   private double DC;
   protected double fatPercentage;
   public DC_Calculator_Women(int age, int total_Pliegues) {
       this.age = age;
       this.total_Pliegues = total_Pliegues;

   }
   public double calculateDC() {
       // •    Mujeres: Densidad Corporal (DC) = 1.0994921 – (0.0009929 × Suma Pliegues) + (0.0000023 × Suma Pliegues al Cuadrado) – (0.0001392 × Edad)

       DC = 1.0994921 - (0.0009929 * total_Pliegues) + (0.0000023 * (total_Pliegues * total_Pliegues)) - (0.0001392 * age);
       return DC;

   }
   public double calculateFat() {
       // •    (%G) = [(4.95/Densidad Corporal) – 4.5] × 100
       fatPercentage = ((4.95 / DC) - 4.5) * 100;
       System.out.println(DC);
       return fatPercentage;
   }


}

public class DC_Calculator_Men extends DC_Calculator_Women{
   private int age;
   private int total_Pliegues;
   private double DC;

   public DC_Calculator_Men(int age, int total_Pliegues) {
       super(age, total_Pliegues);
       this.age = age;
       this.total_Pliegues = total_Pliegues;
   }

   @Override
   public double calculateDC() {
       // •    Hombres: Densidad Corporal (DC) = 1.1093800 – (0.0008267 × Suma Pliegues) + (0.0000016 × Suma Pliegues al Cuadrado) – (0.0002574 × Edad)
       DC =  1.1093800 - (0.0008267 * total_Pliegues) + (0.0000016 * (total_Pliegues * total_Pliegues) - (0.0002574 * age));
       return DC;
   }

}


public class Main {
   public static void main(String[] args) {
       double DC;
       double fat;

       // Women
       DC_Calculator_Women Wtest1 = new DC_Calculator_Women(25, 51);
       DC = Wtest1.calculateDC();
       fat = Wtest1.calculateFat();

       System.out.printf("Women (DC): %5.2f\n", DC);
       System.out.printf("Women (fat): %5.2f\n", fat);

       // Men
       DC_Calculator_Men Mtest1 = new DC_Calculator_Men(35, 40);
       DC = Mtest1.calculateDC(); // **** DC in this method counts as 0 ***
       fat = Mtest1.calculateFat();

       System.out.printf("Men (DC): %5.2f\n", DC);
       System.out.printf("Men (fat): %5.2f\n", fat);

   }
}


Ответы [ 2 ]

1 голос
/ 14 апреля 2020

BUG : значение D C, рассчитываемое в детском (мужском) классе, было недоступно в родительском (женском) классе.

Таким образом, каждый раз дочерний класс, использовал родительский класс convertFat () , значение D C указанной переменной было родительского класса (как неинициализированный, это было 0,0)

Решение : Я создал метод установки setWomenD C (двойной D C), чтобы установить значение D C в родительском (женском) классе. Это будет использоваться дочерним (мужским) классом при расчете значения D C для себя. Используя это, он установит то же значение для D C в родительском (женском) классе.

Добавьте этот метод в класс DC_Calculator_Women

//add this method to receive DC value from child(men) class
public void setWomenDC(double DC){
    this.DC = DC;
}

Редактировать метод CalculateD C () в классе DC_Calculator_Men

@Override
public double calculateDC() {
    // •    Hombres: Densidad Corporal (DC) = 1.1093800 – (0.0008267 × Suma Pliegues) + (0.0000016 × Suma Pliegues al Cuadrado) – (0.0002574 × Edad)
    DC =  1.1093800 - (0.0008267 * total_Pliegues) + (0.0000016 * (total_Pliegues * total_Pliegues) - (0.0002574 * age));
    setWomenDC(DC); //CHANGED HERE: pass the value DC to parent class
    return DC;
}   

Решение № 2

сделать модификатор доступа D C в DC_Calculator_Women класс как защищенный

И, удалите объявление переменной D C из DC_Calculator_Men класс

Теперь запустите программу

Здесь мы заставляем дочерний класс использовать переменную родительского класса .

0 голосов
/ 14 апреля 2020

Mtest1.calculateFat() вызывает calculatFat метод в DC_Calculator_Women классе. Однако переменная DC в классе DC_Calculator_Women инициализируется в 0 по умолчанию при вызове конструктора для класса DC_Calculator_Men (DC_Calculator_Men Mtest1 = new DC_Calculator_Men(35, 40);). Это приводит к тому, что fatPercentage = ((4.95 / DC) - 4.5) * 100; возвращает бесконечность (4.95 / D C = бесконечность).

Вы должны поставить правильные проверки в своем коде, чтобы предотвратить деление на 0 и рассмотреть возможность передачи D C в качестве параметра метода или Вызовите CalculateD C в методе CalculateFat. На самом деле в коде много проблем, таких как плохое наследование. имена переменных et c. Но не вдаваясь во все это здесь.

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