3

私は一般的なクラスと、クラスを拡張するPerson2 種類の人々Studentを持っています。また、そのセッションに参加する学生のリストと教師のリストを保存する教育セッションもあります。TeacherPerson

class Person {}
class Student extends Person {}
class Teacher extends Person {}

class Session {
  List<Student> students = new ArrayList();
  List<Teacher> teachers = new ArrayList();

  // add a person to the teaching session.
  // They should be placed into the appropriate lists
  public void enroll(Person p)
  {
    if (p instanceof Student)
      students.add((Student) p)
    else if (p instanceof Teacher)
      teachers.add((Teacher) p)
  }
}

アイデアは、他のコードに人々のリストがあり、必要に応じてリストを繰り返して適切なセッションに登録するというものです。ただし、enrollメソッドは現在、オブジェクトのタイプを明示的にチェックしています。これは、私にとって望ましくなく、悪い設計のように思えます。

enrollメソッドのオーバーロードを使用して、このようなメソッドを作成しようとしましたが、これははるかにきれいに見えます

public void enroll(Student p)
{
    students.add(p)
}

public void enroll(Teacher p)
{
    teachers.add(p)
}

しかし、オブジェクトのリストを反復処理するコードはPerson、現在の人物が学生インスタンスか教師インスタンスかを判断し、enrollメソッドに渡す前に適切に型キャストする必要があるようです。

instanceof自分のコードでいつでも呼び出す必要がないように、これを設計する方法はありますか?

4

5 に答える 5

7
  1. Sessionあなたの質問のように、オーバーロードされた登録メソッドが必要です。
  2. パラメータとして受け取るabstract enrollメソッドをPersonクラスに追加しますSession

    public abstract void enroll (Session s);

  3. TeacherおよびStudent各オーバーライドenroll

    public void enroll (Session s) {
         s.enroll(this);
    }
    
于 2013-05-28T17:49:06.650 に答える
0

具体的な実装ごとにオーバーロードされたメソッドで提案したことを行うことができPerson、それに加えて、リストにタイプを追加できます。

List<Student> students = new ArrayList<>();
List<Teacher> teachers = new ArrayList<>();

次に、反復ロジックでタイプを知っています。

于 2013-05-28T16:53:20.107 に答える
0

あなたはそれを好転させることができます:

class Session {
  StudentList students = new StudentList();
  TeacherList teachers = new TeacherList();

  // add a person to the teaching session.
  // They should be placed into the appropriate lists
  public void enroll(Person p)
  {
     p.addMe(students, teachers);
  }
}

public class StudentList extends ArrayList<Student> {
}

public class TeacherList extends ArrayList<Teacher> {
}

public abstract class Person {
    public abstract void addMe(StudentList sList, TeacherList tList);
}

public class Student extends Person {
    public void addMe(StudentList sList, TeacherList tList) {
        sList.add(this);
    }
}

public class Teacher extends Person {
    public void addMe(StudentList sList, TeacherList tList) {
        tList.add(this);
    }
}
于 2013-05-28T16:54:21.663 に答える