Gå til innhold

Oppgave: Arv og iterasjon i Java


Anbefalte innlegg

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 av g_threepwood
Lenke til kommentar
Videoannonse
Annonse

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 av jonny
Lenke til kommentar

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 av g_threepwood
Lenke til kommentar

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

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 av g_threepwood
Lenke til kommentar

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

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 av g_threepwood
Lenke til kommentar

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 av g_threepwood
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...