g_threepwood Skrevet 10. juni 2013 Del Skrevet 10. juni 2013 (endret) Superklasse public abstract class Student { protected String studentName; protected int studentNumber; public String getStudentName() { return studentName; } public void setStudentName(String studName) { studentName = studName; } public int getStudentNumber() { return studentNumber; } public void setStudentNumber(int studNum) { studentNumber = studNum; } public float getAverageGrade() { float aveGrade = 0.00; if(studentGrade.isEmpty()) { aveGrade = 6; } else { int size = studentGrade.size(); int sum = 0; for(int i = 0; i < size; i++) { gradeInfo gi = studentGrade.get(i); sum += gi.getGradeNum(); } aveGrade = sum/size; } return aveGrade; } } } Subklasse import java.util.ArrayList; public class BachelorStudent extends Student { private ArrayList<GradeInfo> studentGrade; public BachelorStudent(String studName, int studNum) { super(studName, studNum); studentGrade = new ArrayList<GradeInfo>(); } public float getAverageGrade() { super.getAverageGrade(); } } Subklasse import java.util.ArrayList; public class GraduatedStudent extends Student { private ArrayList<GradeInfo> studentGrade; private int masterThesisGrade; public GraduatedStudent(String studName, int studNum, int thesisGrade) { super(studName, studNum); studentGrade = new ArrayList<GradeInfo>(); masterThesisGrade = thesisGrade; } public float getAverageGrade() { float totalGrade = 0.00; super.getAverageGrade(); totalGrade = ((aveGrade*0.50)+(masterThesisGrade*0.50)); return totalGrade; } } Ser dere tegn på dårlig design eller kompileringsfeil her? Skal private ArrayList<GradeInfo> studentGrade; inn i superklassen i stedet? Jeg vil bruke disse klassene som utgangspunkt for en ny klasse StudentCollection som representerer en samling studenter. Klassen skal ha en metode som beregner gjennomsnittskarakter for alle studenter (skal beregnes på riktig måte både for bachelorstudenter og for ferdige masterstudenter). Dersom det ikke finnes noen studenter skal verdien 6 returneres. Kan noen hjelpe meg her? Endret 10. juni 2013 av g_threepwood Lenke til kommentar
jonny Skrevet 10. juni 2013 Del Skrevet 10. juni 2013 (endret) Sikkert flere måter og gjøre det på, du kan f.eks. gjøre det slik: 1. Gjør getAverageGrade() i Student abstrakt og flytt implementasjonen der til BachelorStudent 2. Endre GraduatedStudent til å arve BachelorStudent isteden (og fjern studentGrade fra GraduatedStudent), og endre getAverageGrade() der til følgende: return (super.getAverageGrade() + masterThesisGrade) * 0.5; Endret 10. juni 2013 av jonny Lenke til kommentar
g_threepwood Skrevet 10. juni 2013 Forfatter Del Skrevet 10. juni 2013 (endret) Så det bør være slik? public abstract class Student { protected String studentName; protected int studentNumber; public String getStudentName() { return studentName; } public void setStudentName(String studName) { studentName = studName; } public int getStudentNumber() { return studentNumber; } public void setStudentNumber(int studNum) { studentNumber = studNum; } public abstract float getAverageGrade() } import java.util.ArrayList; public class BachelorStudent extends Student { private ArrayList<GradeInfo> studentGrade; public BachelorStudent(String studName, int studNum) { super(studName, studNum); studentGrade = new ArrayList<GradeInfo>(); } public float getAverageGrade() { float aveGrade = 0.00; if(studentGrade.isEmpty()) { aveGrade = 6; } else { int size = studentGrade.size(); int sum = 0; for(int i = 0; i < size; i++) { gradeInfo gi = studentGrade.get(i); sum += gi.getGradeNum(); } aveGrade = sum/size; } return aveGrade; } } public class GraduatedStudent extends BachelorStudent { private int masterThesisGrade; public GraduatedStudent(String studName, int studNum, int thesisGrade) { super(studName, studNum); masterThesisGrade = thesisGrade; } public float getAverageGrade() { return (super.getAverageGrade() + masterThesisGrade) * 0.5; } } Endret 10. juni 2013 av g_threepwood Lenke til kommentar
jonny Skrevet 10. juni 2013 Del Skrevet 10. juni 2013 Ja, for eksempel. Du bør ha med et semikolon etter getAverageGrade() i Student. Det er også greit å merke getAverageGrade() i BachelorStudent og GraduatedStudent med @Override foran public, da vil du få feilmelding hvis metoden ikke finnes i superklassen (hvis du f.eks. har skrevet metodenavnet feil). Lenke til kommentar
g_threepwood Skrevet 10. juni 2013 Forfatter Del Skrevet 10. juni 2013 (endret) Har definert denne klassen fra tidligere. Den beregner gjennomsnittskarakter for alle bachelorstudenter: public class BachelorStudents { private ArrayList<BachelorStudent> bachelors; public float getAveGradeOfStudents() { float aveGrade = 0.00; if(bachelors.isEmpty()) { aveGrade = 6; } else { int size = bachelors.size(); double sum = 0.00; for(int i = 0; i < size; i++) { bachelorStudent bs = bachelors.get(i); sum += bs.getAverageGrade(); } aveGrade = sum/size; } return aveGrade; } } Det jeg er ute etter nå, er en klasse StudentCollection som har en metode som beregner gjennomsnittskarakter for alle studenter (skal beregnes på riktig måte både for bachelorstudenter og for ferdige masterstudenter). Dersom det ikke finnes noen studenter skal verdien 6 returneres. Endret 10. juni 2013 av g_threepwood Lenke til kommentar
jonny Skrevet 10. juni 2013 Del Skrevet 10. juni 2013 Du kan bruke BachelorStudents slik den er nå, og legge alle BachelorStudent- og GraduateStudent-objektene i bachelors-lista. Evt. kan du bruke Student istedenfor BachelorStudent for bachelors-lista, da getAverageGrade() er definert i Student-klassen. Lenke til kommentar
g_threepwood Skrevet 10. juni 2013 Forfatter Del Skrevet 10. juni 2013 (endret) Kan dette gå? import java.util.ArrayList; public class StudentCollection { private ArrayList<Student> students; public StudentCollection { students = new ArrayList<Student>(); } public void addStudent(Student student) { studentCollection.add(student); } public float getAverageGradeOfAllStudents() { for(Student student : students) { return averageGrade; } } } Endret 10. juni 2013 av g_threepwood Lenke til kommentar
g_threepwood Skrevet 10. juni 2013 Forfatter Del Skrevet 10. juni 2013 (endret) Hvis vi ikke bryr oss om superklasser, da har vi disse klassene: BachelorStudent import java.util.ArrayList; public class BachelorStudent { private String studentName; private String studentNumber; private ArrayList<GradeInfo> studentGrade; public BachelorStudent(String studName, int studNum) { setStudentName(studName); setStudentNumber(studNum); studentGrade = new ArrayList<GradeInfo>(); } public String getStudentName() { return studentName; } public void setStudentName(String studName) { studentName = studName; } public String getStudentNumber() { return studentNumber; } public void setStudentNumber(String studNum) { studentNumber = studNum; } public ArrayList<GradeInfo> getStudentGrade() { return studentGrade; } public void setStudentGrade(ArrayList<GradeInfo> studentGrade) { studentGrade = studentGrade; } public float getAverageGrade(){ float aveGrade = 0.00; if(studentGrade.isEmpty()) { aveGrade = 6; } else { int size = studentGrade.size(); int sum = 0; for(int i = 0; i < size; i++) { gradeInfo gi = studentGrade.get(i); sum += gi.getGradeNum(); } aveGrade = sum/size; } return aveGrade; } } GraduatedStudent import java.util.ArrayList; public class GraduatedStudent { private String studentName; private String studentNumber; private ArrayList<GradeInfo> studentGrade; private int masterThesisGrade; public GraduatedStudent(String studName, int studNum, int thesisGrade) { setStudentName(studName); setStudentNumber(studNum); studentGrade = new ArrayList<GradeInfo>(); masterThesisGrade = thesisGrade; } //Metoder utelatt. public float getTotalGrade(){ float totalGrade = 0.00; float aveGrade = 0.00; if(studentGrade.isEmpty()) { aveGrade = 6; } else { int size = studentGrade.size(); int sum = 0; for(int i = 0; i < size; i++) { gradeInfo gi = studentGrade.get(i); sum += gi.getGradeNum(); } aveGrade = sum/size; } totalGrade = ((aveGrade*0.50)+(masterThesisGrade*0.50)); return totalGrade; } } Jeg ble fortalt å lage en løkke som for hver student beregner gjennomsnittet, og sjekke om studenten er instans av BachelorStudent- eller GraduatedStudent-klassen, og basert på det kalle gjennomsnittsmetoden. Kan noen hjelpe meg med det? Endret 10. juni 2013 av g_threepwood Lenke til kommentar
jonny Skrevet 10. juni 2013 Del Skrevet 10. juni 2013 Kan dette gå? import java.util.ArrayList; public class StudentCollection { private ArrayList<Student> students; public StudentCollection { students = new ArrayList<Student>(); } public void addStudent(Student student) { studentCollection.add(student); } public float getAverageGradeOfAllStudents() { for(Student student : students) { return averageGrade; } } } Du må gjøre noen endringer, her er et forslag: import java.util.ArrayList; public class StudentCollection { private ArrayList<Student> students; public StudentCollection { students = new ArrayList<Student>(); } public void addStudent(Student student) { studentCollection.add(student); } public float getAverageGradeOfAllStudents() { float gradeSum = 0.0; for(Student student : students) { gradeSum += student.getAverageGrade(); } return gradeSum / students.size(); } } Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå