2012-06-28 28 views
6

Tôi chỉ làm việc thông qua một vài điều như thực hành cho một kỳ thi tôi đã sắp tới, nhưng một điều tôi không thể có được vòng đầu của tôi, là sử dụng một biến thuộc về một lớp học, trong một lớp học khác nhau.Làm thế nào để sử dụng một biến của một lớp, trong một lớp khác trong Java?

Tôi có lớp học và lớp Học sinh. Lớp học lưu trữ tất cả các khóa học khác nhau và những gì tôi chỉ đơn giản muốn có thể làm là sử dụng tên của khóa học, trong lớp học sinh viên.

Đây là lớp học của tôi:

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; 

    } 

} 

Và đây là Sinh viên:

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

} 

Tôi thích hợp trong sử dụng 'kéo dài' trong khóa học? Hay điều này là không cần thiết?

Trong hàm tạo của tôi dành cho Sinh viên, tôi đang cố gắng gán 'courseTitle' từ lớp học cho biến 'studentCourse'. Nhưng tôi chỉ đơn giản là không thể làm thế nào để làm điều này!

Cảm ơn trước sự giúp đỡ của bạn, tôi rất mong nhận được thông tin từ bạn!

Cảm ơn!

Trả lời

4

Tôi giả định một khóa học không phải là một sinh viên, vì vậy kế thừa giữa các lớp đó có lẽ là một ý tưởng tồi.

4

Bạn phải khai báo chúng công khai.

Cách tốt hơn là giữ riêng tư và đặt mã công khai cho biến đó. ví dụ:

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

Course không được mở rộng Student. Nếu bạn muốn truy cập vào trường courseTitle của Course, bạn cần chuyển một tham chiếu đến đối tượng Course tới Student và sau đó thực hiện khóa học.CourseTitle.

2

Bạn không thể truy cập các thuộc tính riêng của lớp này từ lớp khác, đây là một trong những nguyên tắc chính của OOP: đóng gói. Bạn phải cung cấp phương thức truy cập cho các thuộc tính đó, bạn muốn xuất bản bên ngoài lớp. Cách tiếp cận chung là setter/getters - getters chỉ, nếu bạn muốn lớp của bạn không thay đổi được. Hãy xem tại đây: http://en.wikipedia.org/wiki/Mutator_method#Java_example

11

Tôi có đúng khi sử dụng 'mở rộng' trong khóa học không? Hay điều này là không cần thiết?

Đáng tiếc là không, nếu bạn muốn biết liệu thừa kế của bạn là chính xác hay không, thay thế kéo dài với là-một. Một khóa học là một sinh viên? Câu trả lời là không. Có nghĩa là bạn Course không nên mở rộng Student

Một sinh viên có thể tham dự một Course, vì thế mà lớp Student có thể có một biến thành viên kiểu Course. Bạn có thể xác định danh sách các khóa học nếu mô hình của bạn xác định rằng (một sinh viên có thể tham dự một số khóa học).

Dưới đây là một số mẫu mã:

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

Bây giờ, bạn có thể có những điều sau đây:

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

Nó không có ý nghĩa tự ý mở rộng các lớp học. Sinh viên không phải là một khóa học hoặc ngược lại, vì vậy bạn không thể mở rộng chúng như thế.

Những gì bạn cần làm là:

tạo ra một khóa học đầu tiên:

 Course aCourse = new Course(..); 

tạo Sinh viên:

 Student aStudent = new Student(..); 

gán các khóa học cho Sinh viên:

 aStudent.setCourse(aCourse.title); 
2

Mở rộngStudent với Couse vì chúng không cùng loại. Mở rộng một lớp học với một trường hợp khác sẽ diễn ra khi chuyên môn tổng quát hơn (theo nghĩa).
Các giải pháp sẽ được vượt qua courseTitle như một cuộc tranh cãi của các nhà xây dựng Student

2

Nên có 3 đối tượng riêng biệt ở đây, một khóa học, một sinh viên, và một tuyển. Một tuyển sinh kết nối một học sinh với một khóa học, một khóa học có nhiều sinh viên, và một sinh viên có thể ghi danh vào nhiều khóa học. Không ai trong số họ nên mở rộng lẫn nhau.

+0

Tôi không nghĩ rằng bạn cần thêm lớp nhiều đối với nhiều bảng ánh xạ tham gia (đối tượng ghi danh) cho trường hợp này. (Trừ khi điều này cần phải được lưu giữ trong cơ sở dữ liệu truyền thống) –

+0

@ John: có, nhưng kể từ khi OP dường như bị phơi bày với một số ví dụ khủng khiếp về lạm dụng OO, tôi muốn hiển thị một giải pháp thay thế triệt để hơn cho mô hình này. –

+0

có ý nghĩa. –

2

Có thể bạn không cần phải thêm tên khóa học vào học sinh. Những gì tôi sẽ làm là thêm Học sinh vào một số cơ sở hạ tầng trong khóa học. Điều này là sạch hơn và làm giảm sự liên kết giữa Khóa học và Học sinh. Điều này cũng sẽ cho phép bạn sinh viên tham gia nhiều khóa học. Ví dụ:

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

Thứ nhất,

Bạn đang mở rộng class Student trong lớp học, có nghĩa là, lớp học được tất cả các thuộc tính lớp coruse. Vì vậy, lớp học sinh không có thuộc tính courseTitle.

Thứ hai, vâng, nó là unnesessary - bạn cần phải làm như sau:

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

sử dụng Ví dụ sẽ là một cái gì đó như thế này:

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

Và sau đó, nhận được thông tin khóa học bạn cần từ sinh viên qua, tức là:

student.studentCourse.courseTitle; 

Kể từ bây giờ student.studentCourse sẽ là khóa học đối tượng với tất cả các thuộc tính của nó.

Chúc mừng,

1

Như đã đề cập, tránh xa "mở rộng" cho việc này. Nói chung, bạn không nên sử dụng nó trừ khi mối quan hệ "is-a" có ý nghĩa.

Bạn có lẽ nên cung cấp thu khí cho các phương pháp trên lớp môn học:

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

Và sau đó nếu các class Student cần đó, nó bằng cách nào đó sẽ được một tổ chức của khóa học (đó là tùy thuộc vào bạn trong của bạn thiết kế), và gọi 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

đây dưới đây tìm hiểu các giải pháp của vấn đề của bạn và nếu bạn muốn kiểm tra bên dưới mã trên máy tính của bạn sau đó tạo ra một file có tên Test.java và dán mã dưới đây:

gói 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 


    } 
} 
Các vấn đề liên quan