Je fais un calculateur de pourcentage de graisse et j'étends le calculateur pour hommes car il a fondamentalement la même fonctionnalité. Ce qui se passe, c'est que je n'ajoute pas la méthode de calcul de la graisse de la classe des femmes (parent) pour essayer d'enregistrer du code, mais lorsque je crée une instance de la classe des hommes et que j'utilise la méthode de la graisse, elle ne reçoit pas la valeur que je obtenu d'une méthode dans la classe des hommes. Si vous pouvez expliquer pourquoi je l'apprécierai vraiment.


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);

   }
}


0
Gabriel Colón 14 avril 2020 à 09:45

2 réponses

Meilleure réponse

BOGUE : la valeur de DC étant calculée à la classe enfant (hommes), n'était pas accessible à la classe parent (femmes).

Ainsi, chaque fois que la classe enfant utilisait la classe Parent CalculateFat () , la valeur de la variable DC référencée était de la classe Parent (comme non initialisée, c'était 0,0 )

Solution : j'ai créé une méthode setter setWomenDC (double DC), pour définir la valeur de DC à la classe parent (femmes). Cela sera utilisé par la classe enfant (hommes), tout en calculant la valeur de DC pour elle-même. En utilisant cela, il définira la même valeur pour DC dans la classe parent (femmes).

Ajoutez cette méthode à la classe DC_Calculator_Women

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

Modifier la méthode CalculateDC () dans la classe 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;
}   

Solution n ° 2

Définir le modificateur d'accès de DC à la classe DC_Calculator_Women comme protected

Et supprimez la déclaration de variable DC de la classe DC_Calculator_Men

Maintenant, exécutez le programme

Ici, nous faisons en sorte que la classe enfant utilise la variable de la classe Parent .

1
Aditya Rewari 14 avril 2020 à 08:13

Mtest1.calculateFat() appelle la méthode calculatFat dans la classe DC_Calculator_Women. Cependant, la variable DC de la classe DC_Calculator_Women est initialisée à 0 par défaut lors de l'appel du constructeur à la classe DC_Calculator_Men (DC_Calculator_Men Mtest1 = new DC_Calculator_Men(35, 40);). Cela fait que fatPercentage = ((4.95 / DC) - 4.5) * 100; renvoie l'infini (4,95 / DC = infini).

Vous devez mettre des vérifications appropriées dans votre code pour éviter la division par 0 et envisager de passer DC en tant que paramètre de méthode ou d'appeler CalculateDC dans la méthode CalculateFat. En fait, il existe de nombreux problèmes dans le code, comme une mauvaise conception de l'héritage. noms de variables, etc. Mais ne pas entrer dans tout cela ici.

0
Tapan Pandya 14 avril 2020 à 07:36