2012-06-28 13 views
6

Estoy trabajando en algunas cosas como práctica para un examen que tengo por delante, pero una cosa que no puedo entender, es usar una variable que pertenece a una clase, en una clase diferente.¿Cómo usar una variable de una clase, en otra en Java?

Tengo una clase de curso y una de estudiante. El curso de la clase almacena todos los diferentes cursos y lo que simplemente quiero hacer es usar el nombre del curso, en la clase Estudiante.

Aquí es mi clase del curso:

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; 

    } 

} 

Y aquí es estudiante:

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

} 

Estoy en lo correcto en el uso de 'extiende' dentro del curso? ¿O es esto innecesario?

En mi constructor para Estudiante, estoy tratando de asignar 'courseTitle' del curso de la clase, a la variable 'studentCourse'. ¡Pero simplemente no puedo entender cómo hacer esto!

Gracias de antemano por su ayuda, espero con interés escuchar de usted!

Gracias!

Respuesta

4

Supongo que un curso no es a Estudiante, por lo que la herencia entre esas clases es probablemente una mala idea.

4

Debes declararlos públicos.

Una mejor manera es mantenerlos privados, y codificar un getter público para esa variable. por ejemplo:

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

Course no debería extenderse Student. Si desea acceder al campo courseTitle de Course, debe pasar una referencia a un objeto Course al Student y luego hacer course.CourseTitle.

2

No se puede acceder a los atributos privados de una clase de otro, este es uno de los principios principales de OOP: encapsulación. Debe proporcionar el método de acceso a esos atributos, que desea publicar fuera de la clase. El enfoque común es setter/getters - getters solamente, si quieres que tu clase sea inmutable. Mire aquí: http://en.wikipedia.org/wiki/Mutator_method#Java_example

11

¿Estoy en lo correcto al usar 'extends' en el Curso? ¿O es esto innecesario?

Desafortunadamente no

, si desea saber si su herencia es correcta o no, reemplace extiende con is-a. Un curso es un estudiante? La respuesta es no. Lo que significa que su Course no debe extenderse Student

un estudiante puede asistir a una Course, por lo tanto, la clase Student puede tener una variable miembro de tipo Course. Puede definir una lista de cursos si su modelo especifica que (un alumno puede asistir a varios cursos).

Aquí es un ejemplo de código:

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

Ahora, usted puede tener lo siguiente:

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

No tiene sentido extender arbitrariamente clases. El estudiante no es un curso o viceversa, por lo que no puede extenderlos de esa manera.

Lo que hay que hacer es:

crear un curso en primer lugar:

 Course aCourse = new Course(..); 

crear un Estudiante:

 Student aStudent = new Student(..); 

asignar el aprendizaje al estudiante:

 aStudent.setCourse(aCourse.title); 
2

ExtendiendoStudent con Couse porque no son del mismo tipo. La extensión de una clase con otra ocurre cuando se especializa en una más general (en cierto sentido).
La solución sería pasar courseTitle como argumento del constructor Student

2

No debe haber 3 objetos separados por aquí, un curso, un estudiante, y una matrícula. Una inscripción conecta un Estudiante a un Curso, un Curso tiene muchos Estudiantes y un Estudiante puede inscribirse en muchos cursos. Ninguno de ellos debería extenderse el uno al otro.

+0

No creo que necesite una capa adicional de la tabla de asociación de asignación muchos a muchos (objeto de inscripción) para este caso. (A menos que esto deba persistir en una base de datos tradicional) –

+0

@John: sí, pero dado que el OP aparentemente ha estado expuesto a algún tipo de ejemplos horribles de mal uso de OO, prefiero mostrar una alternativa más completa para modelar esto. –

+0

que tenga sentido. –

2

Quizás no necesite agregar el nombre del curso al alumno. Lo que yo haría es agregar Estudiantes a alguna estructura de datos en el Curso. Esto es más limpio y reduce el acoplamiento entre Curso y Estudiante. Esto también te permitirá tener estudiantes en más de un curso. Por ejemplo:

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

En primer lugar,

está extendiendo la clase Estudiante en la clase de golf, lo que significa, clase estudiante obtiene todas las propiedades de la clase coruse. Entonces, la clase de estudiante no tiene la propiedad courseTitle.

En segundo lugar, sí, es unnesessary - que tiene que hacer lo siguiente:

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

Ejemplo de uso sería algo como esto:

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

Y luego, obtener la información del curso que necesita del estudiante a través de, por ejemplo:

student.studentCourse.courseTitle; 

desde ahora student.studentCourse será un curso objeto con todas sus propiedades.

Saludos,

1

Como se ha mencionado, se mantenga alejado de la "extiende" para esto. En general, no debes usarlo a menos que la relación "es-a" tenga sentido.

Probablemente debería proporcionar captadores de los métodos de la clase del curso:

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

Y entonces, si la clase El estudiante necesita que, de alguna manera podría obtener una bodega del curso (que depende de usted en su diseño), y llamar al comprador:

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

a continuación encontrar la solución de su problema y si desea comprobar a continuación el código en su máquina a continuación, crear un archivo llamado Test.java y pegar el siguiente código:

paquete 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 


    } 
} 
Cuestiones relacionadas