Héritage, Sous-classe, Impression avec super.print() en Java


J'ai 4 classes différentes. Intitulé Student, un Instructor, un Person et Main. Voici mon code:

Étudiant:

public class Student extends Person {
public void print() {
    super.print();
    System.out.println(", credits: " + credits);
}
}

Instructeur:

public class Instructor extends Person{
private double salary;
public double getSalary() {
    return salary;
}

public void setSalary(double newSalary) {
    salary = newSalary;
}

public void print() {
    super.print();
    System.out.println(", salary: " + salary);
}
}

Personne:

public class Person {

private String name;
private String id;

public String getName() {
return name;
}

public void setName(String replacementName) {
name = replacementName;
}

public String getID() {
return id;
}

public void setID(String id) {
this.id = id;
}

public void print() {
    System.out.print(name + ", student ID: " + id);
    }

}

Principal:

public class Main {

public static void main(String[] args) {
    Instructor instructor = new Instructor();
    instructor.setName("Hani Javadi");
    instructor.setID("888777666");
    instructor.setSalary(11111);
    instructor.print();

    System.out.println("--- --- ---");

    Student student1 = new Student();
    student1.setName("Joe Loop");
    student1.setID("810123456");
    student1.addCredits(10);
    student1.print();

    Student student2 = new Student();
    student2.setName("Mary Collection");
    student2.setID("811987321");
    student2.addCredits(25);
    student2.print();

    Student student3 = new Student();
    student3.setName("Ke Method");
    student3.setID("810010101");
    student3.print();
}

}

Quand je vais sortir ce code, le résultat est le suivant:


Hani Javadi, student ID: 888777666, salary: 11111.0 

Joe Loop, student ID: 810123456, credits: 10

Mary Collection, student ID: 811987321, credits: 25 

Ke Method, student ID: 810010101, credits: 0

Toutefois, la sortie doit avoir la première ligne comme:


Hani Javadi, instructor ID: 888777666, salary: 11111.0 

Quelqu'un Peut-il aider à résoudre cette erreur triviale? J'ai travaillé pendant des heures pour essayer de trouver un moyen de le réparer en ajoutant une instruction if dans la superclasse Person mais rien ne semble fonctionner. Existe-t-il un moyen simple de faire imprimer la déclaration instructeur pour afficher l'ID instructeur plutôt que l'ID étudiant?

Author: Raju, 2017-11-08

4 answers

Yo, Cela arrive parce que vous avez 'student ID' dans la classe Person, cela fonctionne au niveau abstrait

Par exemple, vous pouvez essayer d'utiliser l'approche suivante en classe de Personne:

public void print() {
    System.out.print(name + ", " + getClass().getName() + "  ID: " + id);
}
 -1
Author: Skytrace, 2017-11-07 22:31:30

Vous devriez peut-être déplacer l'impression du champ id entièrement dans les sous-classes, plutôt que dans la classe parente, afin qu'ils puissent déterminer l'indicateur avancé approprié.

 0
Author: KristinaTracer, 2017-11-07 22:21:56

Votre problème principal est que votre classe Person dit studentId=.... C'est une très belle formation sur le polymorphisme, et cela vous montre déjà où votre approche a mal tourné.

La chose est, Person ne devrait pas avoir quelque chose qui est Student-spécifique. Si c'est un ID de Person, il devrait dire personId=... à la place. Si l'ID est quelque chose de complètement différent entre Student et Instructor, vous devez faire ces impressions dans ces deux classes à la place.

Polymorphisme, héritage. Ces outils peuvent faire génial chose. Mais ils peuvent se retourner contre eux s'ils sont mal utilisés, ce qui vient de vous arriver.


Maintenant, sérieusement, ne le faites pas comme ça:

if (this instanceof Student) {
    System.out.print("student ID=" + id)
} else if (this instanceof Instructor) {
    System.out.println("instructor ID=" + id);
} else {
    // some default here, or I don't know.
}

Cela fonctionne absolument, mais c'est un désastre du point de vue de la conception. Ce que @ Skytrace a mentionné fonctionne et n'est même pas aussi laid. Cependant, cela ne fonctionnerait que dans ce cas particulier où le nom de la classe est égal à ce que vous souhaitez afficher. Et si quelqu'un le refactorise, renommant Student class en par exemple StudentDto, vous verrez StudentDto ID=..., qui est plus agréable.

 0
Author: Vlasec, 2017-11-07 22:34:48

Créer une autre méthode dans la classe Personne ci-dessous

   public void print() {
    System.out.print(name + ", student ID: " + id);
    }

Par exemple

public void print2() {
    System.out.print(name + ", Instructor ID: " + id);
    }

Puis appelez-le dans votre classe principale comme instructeur.print2 ();

 -2
Author: Promise Obe, 2017-11-07 22:32:12