2012-06-28 3 views
6

Sto solo lavorando su alcune cose come pratica per un esame che sto arrivando, ma una cosa che non riesco a capire, sta usando una variabile che appartiene a una classe, in una classe diversa.Come usare una variabile di una classe, in un'altra in Java?

Ho una classe di corso e una classe di studenti. Il corso di formazione memorizza tutti i diversi corsi e quello che voglio semplicemente essere in grado di fare è usare il nome del corso, in classe Student.

Qui è la mia Classe di corso:

public class Course extends Student 
{ 
    // instance variables - replace the example below with your own 
    private Award courseAward; 
    private String courseCode; 
    public String courseTitle; 
    private String courseLeader; 
    private int courseDuration; 
    private boolean courseSandwich; 

    /** 
    * Constructor for objects of class Course 
    */ 
    public Course(String code, String title, Award award, String leader, int duration, boolean sandwich) 
    { 
     courseCode = code; 
     courseTitle = title; 
     courseAward = award; 
     courseLeader = leader; 
     courseDuration = duration; 
     courseSandwich = sandwich; 

    } 

} 

Ed ecco Studente:

public class Student 
{ 
    // instance variables - replace the example below with your own 
    private int studentNumber; 
    private String studentName; 
    private int studentPhone; 
    private String studentCourse; 

    /** 
    * Constructor for objects of class Student 
    */ 
    public Student(int number, String name, int phone) 
    { 
     studentNumber = number; 
     studentName = name; 
     studentPhone = phone; 
     studentCourse = courseTitle; 
    } 

} 

Sono corretto utilizzando 'estende' all'interno del corso? O è questo non necessario?

Nel mio programma di costruzione per Studente, sto cercando di assegnare "corsoTitolo" dal corso della classe, alla variabile "studenteCorso". Ma semplicemente non riesco a capire come farlo!

Grazie in anticipo per il vostro aiuto, non vedo l'ora di sentirvi!

Grazie!

risposta

4

Presumo un corso non è uno studente, quindi l'eredità tra quelle classi è probabilmente una cattiva idea.

4

Devi dichiararli pubblici.

Un modo migliore è mantenerli privati ​​e codificare un getter pubblico per tale variabile. per esempio:

public Award getCourseAward(){ 
     return this.courseAward; 
} 
2

Course non dovrebbe estendersi Student. Se si desidera accedere al campo courseTitle di Course, è necessario passare un riferimento a un oggetto Course allo Student e quindi fare course.CourseTitle.

2

Non è possibile accedere agli attributi privati ​​di una classe da un'altra, questo è uno dei principi principali di OOP: incapsulamento. Devi fornire un metodo di accesso a tali attributi, che desideri pubblicare all'esterno della classe. L'approccio comune è setter/getter, solo se vuoi avere la tua classe immutabile. Guarda qui: http://en.wikipedia.org/wiki/Mutator_method#Java_example

11

Sono corretto nell'utilizzo di "estende" in corso? O è questo non necessario?

non

Purtroppo, se volete sapere se la vostra eredità è corretta o meno, sostituire estende con is-a. Un corso è uno studente? La risposta è no. Il che significa che il tuo Course non dovrebbe estendersi Student

uno studente può frequentare un Course, quindi la classe Student può avere una variabile membro di tipo Course. È possibile definire un elenco di corsi se il modello lo specifica (uno studente può frequentare diversi corsi).

Ecco un esempio di codice:

public class Student{ 
    //.... 
    private Course course; 
    //... 
    public void attendCourse(Course course){ 
     this.course = course; 
    } 
    public Course getCourse(){ 
     return course; 
    } 
} 

Ora, si può avere il seguente:

Student bob = new Student(...); 
Course course = new Course(...); 
bob.attendCourse(course); 
2

Non ha senso per estendere arbitrariamente classi. Lo studente non è un corso o viceversa, quindi non è possibile estenderlo in questo modo.

Quello che dovete fare è:

creare un corso prima:

 Course aCourse = new Course(..); 

creare uno Studente:

 Student aStudent = new Student(..); 

assegnare il corso per lo studente:

 aStudent.setCourse(aCourse.title); 
2

EstensioneStudent con Couse perché non sono dello stesso tipo. L'estensione di una classe con un'altra avviene quando si specializza in una più generale (in un certo senso).
La soluzione potrebbe essere quella di passare courseTitle come argomento del costruttore Student

2

Dovrebbe esserci 3 oggetti separati qui, un corso lo studente, e un'iscrizione. Un'iscrizione collega uno studente a un corso, un corso ha molti studenti e uno studente può iscriversi a molti corsi. Nessuno di loro dovrebbe estendersi l'un l'altro.

+0

Non penso che per questo caso sia necessario un ulteriore livello della tabella di join di mappatura molti a molti (oggetto di registrazione). (A meno che non sia necessario mantenerlo in un database tradizionale) –

+0

@John: sì, ma dal momento che l'OP è apparentemente stato esposto a una sorta di orribile esempio di uso improprio di OO, preferirei mostrare un'alternativa più completa per modellarlo. –

+0

questo ha un senso. –

2

Forse non è necessario aggiungere il nome del corso allo studente. Quello che vorrei fare è aggiungere gli studenti a qualche datastructure in corso. Questo è più pulito e riduce l'accoppiamento tra Corso e Studente. Questo ti permetterebbe anche di avere studenti in più di un corso. Per esempio:

public class Course extends Student{ 
    private Award courseAward; 
    private String courseCode; 
    public String courseTitle; 
    private Student courseLeader;//change to a student Object 
    private int courseDuration; 
    private boolean courseSandwich; 
    private Set<Student> students;//have course hold a collection of students 

/** 
* Constructor for objects of class Course 
*/ 
public Course(String code, String title, Award award, Student leader, int duration, boolean sandwich){ 
    courseCode = code; 
    courseTitle = title; 
    courseAward = award; 
    courseLeader = leader; 
    courseDuration = duration; 
    courseSandwich = sandwich; 
    this.students=new HashSet<Student>(); 
} 

public boolean addStudent(Student student){ 
    return students.add(student); 
} 

public Set<Student> getStudents(){ 
    return students; 
} 

}

2

In primo luogo,

si sta estendendo classe Studente in classe del corso, il che significa, classe studente ottiene tutte le proprietà della classe coruse. Quindi, la classe studentesca non ha la proprietà CourseTitle.

In secondo luogo, sì, è unnesessary - è necessario fare quanto segue:

public class Course 
{ 
    private Award courseAward; 
    private String courseCode; 
    public String courseTitle; 
    private String courseLeader; 
    private int courseDuration; 
    private boolean courseSandwich; 

    public Course(String code, String title, Award award, String leader, int duration, boolean sandwich) 
    { 
     courseCode = code; 
     courseTitle = title; 
     courseAward = award; 
     courseLeader = leader; 
     courseDuration = duration; 
     courseSandwich = sandwich; 

    } 

} 

public class Student 
{ 
    private int studentNumber; 
    private String studentName; 
    private int studentPhone; 

    // This is where you keep the course object associated to student 
    public Course studentCourse; 

    public Student(int number, String name, int phone, Course course) 
    { 
     studentNumber = number; 
     studentName = name; 
     studentPhone = phone; 
     studentCourse = course; 
    } 
} 

esempio d'uso potrebbe essere qualcosa di simile:

Course course = new Course("ASD", "TITLE", null, "ME", 50, true); 
Student student = new Student(1, "JOHN", "5551234", course); 

E poi, ottenere le informazioni Naturalmente è necessario dallo studente via, vale a dire:

student.studentCourse.courseTitle; 

Da ora studente.studentCourse sarà un corso oggetto con tutte le sue proprietà.

Cheers,

1

Come accennato, stare lontano dal "estende" per questo. In generale, non dovresti usarlo a meno che la relazione "is-a" abbia un senso.

Probabilmente si dovrebbe fornire getter per i metodi sulla classe del corso:

public class Course { 
    ... 
    public String getTitle() { 
     return title; 
    } 
} 

E poi se la classe studente ha bisogno che, sarebbe in qualche modo ottenere una sospensione del corso (che è fino a voi nella vostra design), e chiamare il getter:

public class Student { 
    private Set<Course> courses = new HashSet<Course>(); 

    public void attendCourse(Course course) { 
     courses.add(course); 
    } 

    public void printCourses(PrintStream stream) { 
     for (Course course : courses) { 
      stream.println(course.getTitle()); 
     } 
    } 
} 
1

di seguito trovare la soluzione del problema e, se si desidera controllare sotto il codice sulla vostra macchina quindi creare un file chiamato Test.java e incollare i codici seguenti:

pacchetto com;

class Course 
{ 
    private Award courseAward; 
    private String courseCode; 
    public String courseTitle; 
    private String courseLeader; 
    private int courseDuration; 
    private boolean courseSandwich; 


    public Course(String code, String title, Award award, String leader, int duration, boolean sandwich) 
    { 
     courseAward = award; 
     courseCode = code; 
     courseTitle = title; 
     courseLeader = leader; 
     courseDuration = duration; 
     courseSandwich = sandwich; 

    } 

    public Award getCourseAward() { 
     return courseAward; 
    } 

    public void setCourseAward(Award courseAward) { 
     this.courseAward = courseAward; 
    } 

    public String getCourseCode() { 
     return courseCode; 
    } 

    public void setCourseCode(String courseCode) { 
     this.courseCode = courseCode; 
    } 

    public String getCourseTitle() { 
     return courseTitle; 
    } 

    public void setCourseTitle(String courseTitle) { 
     this.courseTitle = courseTitle; 
    } 

    public String getCourseLeader() { 
     return courseLeader; 
    } 

    public void setCourseLeader(String courseLeader) { 
     this.courseLeader = courseLeader; 
    } 

    public int getCourseDuration() { 
     return courseDuration; 
    } 

    public void setCourseDuration(int courseDuration) { 
     this.courseDuration = courseDuration; 
    } 

    public boolean isCourseSandwich() { 
     return courseSandwich; 
    } 

    public void setCourseSandwich(boolean courseSandwich) { 
     this.courseSandwich = courseSandwich; 
    } 
} 

class Student 
{ 
    private int studentNumber; 
    private String studentName; 
    private int studentPhone; 
    private Course studentCourse; 
    /** 
    * Constructor for objects of class Student 
    */ 
    public Student(int number, String name, int phone, Course course) 
    { 
     studentNumber = number; 
     studentName = name; 
     studentPhone = phone; 
     studentCourse = course; 
    } 

    public int getStudentNumber() { 
     return studentNumber; 
    } 
    public void setStudentNumber(int studentNumber) { 
     this.studentNumber = studentNumber; 
    } 
    public String getStudentName() { 
     return studentName; 
    } 
    public void setStudentName(String studentName) { 
     this.studentName = studentName; 
    } 
    public int getStudentPhone() { 
     return studentPhone; 
    } 
    public void setStudentPhone(int studentPhone) { 
     this.studentPhone = studentPhone; 
    } 
    public Course getStudentCourse() { 
     return studentCourse; 
    } 
    public void setStudentCourse(Course studentCourse) { 
     this.studentCourse = studentCourse; 
    } 
} 

class Award{ 
    private long awardId; 
    private String awardName; 

    Award(long awardId, String awardName){ 
     this.awardId = awardId; 
     this.awardName = awardName; 
    } 

    public long getAwardId() { 
     return awardId; 
    } 

    public void setAwardId(long awardId) { 
     this.awardId = awardId; 
    } 

    public String getAwardName() { 
     return awardName; 
    } 

    public void setAwardName(String awardName) { 
     this.awardName = awardName; 
    } 
} 

public class Test{ 
    public static void main(String ar[]){ 

     // use your all classes here 


    } 
} 
Problemi correlati