2012-06-28 2 views
6

Ich arbeite gerade durch ein paar Dinge als Übung für eine Prüfung, die ich habe, aber eine Sache, die ich nicht verstehen kann, ist eine Variable, die zu einer Klasse gehört, in einer anderen Klasse.Wie verwendet man eine Variable einer Klasse, in einer anderen in Java?

Ich habe eine Kursklasse und eine Studentenklasse. Der Klassenkurs speichert alle verschiedenen Kurse und was ich einfach machen möchte, ist der Name des Kurses in der Klasse Student.

Hier ist meine Course Klasse:

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; 

    } 

} 

Und hier ist Student:

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

} 

Bin ich bei der Verwendung korrigieren innerhalb Course '' erstreckt? Oder ist das unnötig?

In meinem Konstruktor für Student, versuche ich, CourseTitle aus der Klasse Kurs, um die Variable 'StudentCourse' zuweisen. Aber ich kann mir einfach nicht vorstellen, wie ich das machen soll!

Vielen Dank im Voraus für Ihre Hilfe, ich freue mich von Ihnen zu hören!

Danke!

Antwort

4

Ich nehme an, ein Kurs ist nicht ein Student, so ist die Vererbung zwischen diesen Klassen wahrscheinlich eine schlechte Idee.

4

Sie müssen sie öffentlich machen.

Ein besserer Weg ist, sie privat zu halten und einen öffentlichen Getter für diese Variable zu programmieren. zum Beispiel:

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

Course sollte Student nicht verlängern. Wenn Sie auf das Feld courseTitle von Course zugreifen möchten, müssen Sie eine Referenz an ein Course Objekt an die Student übergeben und dann course.CourseTitle ausführen.

2

Sie können nicht auf private Attribute einer Klasse von einem anderen zugreifen, dies ist eines der Hauptprinzipien von OOP: Kapselung. Sie müssen diesem Attribut eine Zugriffsmethode bereitstellen, die Sie außerhalb der Klasse veröffentlichen möchten. Der übliche Ansatz ist Setter/Getters - Getters nur, wenn Sie Ihre Klasse unveränderlich haben wollen. Schau mal hier: http://en.wikipedia.org/wiki/Mutator_method#Java_example

11

Bin ich richtig bei der Verwendung von 'erweitert' innerhalb Kurs? Oder ist das unnötig?

Leider nicht, wenn Sie wissen wollen, ob Ihr Erbe korrekt ist oder nicht, ersetzen erstreckt mit is-a. Ein Kurs ist ein Student? Die Antwort ist nein. Das bedeutet, Ihre Course nicht Student

Ein Student ein Course kann teilnehmen verlängern soll, damit die Student Klasse eine Membervariable vom Typ Course haben kann. Sie können eine Liste von Kursen definieren, wenn Ihr Modell dies spezifiziert (ein Kursteilnehmer kann mehrere Kurse besuchen).

Hier ist ein Beispielcode:

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

Jetzt können Sie folgende Voraussetzungen erfüllt sein:

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

Es macht keinen Sinn, zu willkürlich Klassen zu erweitern. Student ist kein Kurs oder umgekehrt, also kannst du sie nicht so erweitern.

Was Sie tun müssen, ist:

einen Kurs erstellen Sie zuerst:

 Course aCourse = new Course(..); 

erstellen Student:

 Student aStudent = new Student(..); 

den Kurs auf dem Schüler zuweisen:

 aStudent.setCourse(aCourse.title); 
2

ErweiternStudent mit Couse, weil sie nicht von der gleichen Art sind. Das Erweitern einer Klasse mit einer anderen passiert, wenn man sich auf eine (allgemeinere) allgemeinere Spezialisierung spezialisiert.
Die Lösung wäre courseTitle als Argument des Konstruktors Student passieren

2

Hier gibt es drei separate Objekte sein sollte, ein Kurs, ein Schüler und eine Einschreibung. Eine Registrierung verbindet einen Studenten mit einem Kurs, ein Kurs hat viele Studenten und ein Student kann sich in vielen Kursen einschreiben. Keiner von ihnen sollte sich gegenseitig ergänzen.

+0

Ich glaube nicht, dass Sie zusätzliche Schicht der vielen zu vielen Mapping Join-Tabelle (Enrollment-Objekt) für diesen Fall benötigen. (Es sei denn, dass dies in einer traditionellen Datenbank beibehalten werden muss) –

+0

@John: Ja, aber da das OP anscheinend einer Art von schrecklichen Beispielen für den Missbrauch von OO ausgesetzt war, würde ich lieber eine gründlichere Alternative für die Modellierung zeigen. –

+0

das macht Sinn. –

2

Vielleicht müssen Sie den Kursteilnehmernamen nicht hinzufügen. Was ich tun würde, ist, Schüler zu einer Datenstruktur im Kurs hinzuzufügen. Das ist sauberer und reduziert die Kopplung zwischen Kurs und Student. Dies würde auch ermöglichen, dass die Schüler in mehr als einem Kurs sind. Zum Beispiel:

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

Zuerst

Sie sind Student-Klasse in Course-Klasse erweitern, was bedeutet, bekommt Student Klasse alle coruse Klasse Eigenschaften. Die Kursteilnehmerklasse verfügt also nicht über die courseTitle-Eigenschaft.

Zweitens, ja, es ist unnesessary - Sie Folgendes tun müssen:

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

Beispiel für die Verwendung so etwas wie dieses würde:

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

Und dann bekommen die Kursinformationen Sie brauchen von Studenten über, das heißt:

student.studentCourse.courseTitle; 

Seit heute wird student.studentCourse ein Kurs Objekt mit all seinen Eigenschaften.

Cheers,

1

Wie bereits erwähnt, bleiben weg von der für diese "erweitert". Im Allgemeinen sollten Sie es nicht verwenden, wenn die "ist-a" -Beziehung nicht sinnvoll ist.

Sie sollten wahrscheinlich Getter für die Methoden auf dem Course-Klasse bieten:

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

Und dann, wenn der Student-Klasse muss, dass, würde es bekommen irgendwie einen Halt des Kurses (die in bis zu Ihnen Ihr Design), und rufen Sie das 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

Hier unten die Lösung des Problems finden und wenn Sie unten Code auf Ihrem Computer überprüfen möchten dann eine Datei mit dem Namen Test.java und fügen Sie die folgenden Codes erstellen:

paket 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 


    } 
}