7

来たる試験の練習としていくつかのことをやっているところですが、1 つのクラスに属している変数を別のクラスで使用することは頭を悩ませています。

Course クラスと Student クラスがあります。クラス course にはさまざまなコースがすべて格納されており、私ができるようにしたいことは、クラス Student でコースの名前を使用することです。

ここに私のコースクラスがあります:

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;

    }

}

そして、ここに学生がいます:

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

}

コース内で「 extends 」を使用するのは正しいですか? それともこれは不要ですか?

Student のコンストラクターで、クラス Course の「courseTitle」を変数「studentCourse」に割り当てようとしています。しかし、私はこれを行う方法を理解できません!

ご協力ありがとうございます。ご連絡をお待ちしております。

ありがとう!

4

12 に答える 12

12

コース内で「拡張」を使用するのは正しいですか? それともこれは不要ですか?

残念ながら、継承が正しいかどうかを知りたい場合は、extendsis-aに置き換えてください。コースは学生ですか?答えはノーだ。つまり、Course拡張しないでくださいStudent

学生は に出席できるCourseため、Studentクラスは 型のメンバー変数を持つことができますCourse。モデルで指定されている場合は、コースのリストを定義できます (学生は複数のコースに参加できます)。

サンプルコードは次のとおりです。

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

これで、次のことができます。

Student bob = new Student(...);
Course course = new Course(...);
bob.attendCourse(course);
于 2012-06-28T19:36:00.287 に答える
4

Courseは Student ではないと想定しているため、これらのクラス間の継承はおそらく悪い考えです。

于 2012-06-28T19:34:35.200 に答える
4

それらを公開することを宣言する必要があります。

より良い方法は、それらをプライベートに保ち、その変数のパブリックゲッターをコーディングすることです。例えば:

public Award getCourseAward(){
         return this.courseAward;
}
于 2012-06-28T19:34:48.627 に答える
2

クラスを任意に拡張することは意味がありません。学生はコースではないか、またはその逆であるため、そのように延長することはできません。

あなたがする必要があるのは:

最初にコースを作成します。

       Course aCourse = new Course(..);

学生を作成する:

       Student aStudent = new Student(..);

コースを学生に割り当てます。

       aStudent.setCourse(aCourse.title);
于 2012-06-28T19:38:45.550 に答える
2

それらは同じ種類ではないため、で拡張Studentします。Couseあるクラスを別のクラスに拡張することは、より一般的な(ある意味で)クラスを専門化するときに起こります。解決策は、コンストラクターの引数として
渡すことですcourseTitleStudent

于 2012-06-28T19:39:40.610 に答える
2

ここには、Course、Student、および Enrollment という 3 つの個別のオブジェクトが必要です。登録は学生をコースに接続し、コースには多くの学生がいて、学生は多くのコースに登録できます。それらのどれも互いに拡張するべきではありません。

于 2012-06-28T19:39:56.133 に答える
2

学生にコース名を追加する必要はないかもしれません。私がすることは、学生をコースのデータ構造に追加することです。これはよりクリーンで、Course と Student の間の結合を減らします。これにより、学生を複数のコースに参加させることもできます。例えば:

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

}

于 2012-06-28T19:40:43.153 に答える
2

初め、

Course クラスで Student クラスを拡張しています。つまり、学生クラスはすべての coruse クラス プロパティを取得します。したがって、学生クラスには courseTitle プロパティがありません。

第二に、はい、それは不要です-次のことを行う必要があります:

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

使用例は次のようになります。

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

次に、次の方法で学生から必要なコース情報を取得します。

student.studentCourse.courseTitle;

これ以降、student.studentCourse はすべてのプロパティを持つコース オブジェクトになります。

乾杯、

于 2012-06-28T19:41:03.847 に答える
2

Course延長しないでくださいStudentcourseTitleのフィールドにアクセスする場合は、オブジェクトへのCourse参照を に渡してからcourse.CourseTitle を実行する必要があります。CourseStudent

于 2012-06-28T19:35:26.720 に答える
2

クラスのプライベート属性に別のクラスからアクセスすることはできません。これは、OOP の主な原則の 1 つであるカプセル化です。それらの属性へのアクセス方法を提供する必要があり、クラス外で公開したい。クラスを不変にしたい場合、一般的なアプローチはセッター/ゲッター-ゲッターのみです。こちらをご覧ください: http://en.wikipedia.org/wiki/Mutator_method#Java_example

于 2012-06-28T19:35:45.593 に答える
1

前述のように、このための「拡張」には近づかないでください。一般に、「is-a」関係が意味をなさない限り、使用しないでください。

おそらく、 Course クラスのメソッドに getter を提供する必要があります。

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

そして、Student クラスがそれを必要とする場合、何らかの方法でコースを取得し (これは設計者次第です)、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());
       }
   }
}
于 2012-06-28T22:05:55.400 に答える