2

次のようなオブジェクトがある場合:

Teacher extends Person
Student extends Person

次に、個人のリスト/配列などを返すサービスの関数がありますが、リストの一部の項目は教師である場合と学生である場合があります。

リターンエンドでは、ユーザーが各要素のインスタンスをチェックして、それが学生であるか教師であるかを判断できるようにしたいと思います。

このコードを構造化するための最良の方法は何ですか。

だから、サービスでは私はこのようなものが欲しいです:

public LinkedList<Person> getPersonByID(List<String id>);
4

5 に答える 5

2

最善の方法は、ポリモーフィズムを使用して Person の型を明示的にチェックする必要をなくすことです。これをどのように正確に行うかは、タスクによって異なります。おそらく、より多くのコードを提供できます。

于 2011-01-24T08:04:42.523 に答える
2

これは、ビジター パターンを使用せずinstanceofに解決できます。(問題が通常のポリモーフィズム手法を使用して解決できない場合は、instanceof を避ける必要があるため、おそらくこのアプローチが好まれます。)

これは、 ideone.comのデモを使用して、ここでの私の回答の適応です。

import java.util.*;

public class Test {

    public static void main(String[] args) {

        List<Person> somePersons = new LinkedList<Person>();

        somePersons.add(new Teacher());
        somePersons.add(new Student());
        somePersons.add(new Teacher());

        for (Person p : somePersons)
            p.visit(new Visitor() {
                @Override
                public void accept(Student student) {
                    student.learn("stuff");
                }

                @Override
                public void accept(Teacher teacher) {
                    teacher.teach("some other stuff");
                }
            });
    }
}


interface Visitor {
    public void accept(Teacher a);
    public void accept(Student b);
}

abstract class Person {
    String name;
    abstract void visit(Visitor v);
}

class Teacher extends Person {

    public void teach(String toTeach) {
        System.out.println("I'm teaching " + toTeach);
    }

    public void visit(Visitor sv) {
        sv.accept(this);
    }
}

class Student extends Person {

    public void learn(String toLearn) {
        System.out.println("I'm learning " + toLearn);
    }

    public void visit(Visitor sv) {
        sv.accept(this);
    }
}
于 2011-01-24T08:14:38.083 に答える
0

instanceofJava には、実行時にオブジェクトの型をチェックするために使用できるキーワードがあります。したがって、コードは次のようになります。

LinkedList<Person> foo = getPersonByID(some_id_list);
for (Person p: foo)
   if (p instanceof Teacher)
      // do stuff
   else if (p instanceof Student)
      // again
   else
      // ...
于 2011-01-24T08:02:02.503 に答える
0

後でもっと柔軟性が必要であることがわかっている場合は、is-a からhas-a関係に移行することを検討してください。

has-aは、教師の役割や学生の役割など、Person が持つことができる一連の役割になります。または両方、学生が講義を行っている場合のように..

このアプローチを示す簡単な例:


public enum Role {TEACHER, STUDENT}

public class Person {

    Set<Role> roles = new HashSet<Role>();

    public Person() {
      // a person does not have roles initially
    }

    public boolean addRole(Role aRole) {
      return roles.add(aRole);
    }

    public boolean hasRole(Role aRole) {
      return roles.contains(aRole);
    }

    // ...
}

public void someMethod(Person person) {

    if (Person.hasRole(Role.TEACHER)) {
      // do teacher stuff
    }

    if (Person.hasRole(Role.STUDENT)) {
      // do student stuff
      // Note: persons may be Teacher AND Student at the same time
    }

}
于 2011-01-24T08:15:30.603 に答える
-1

次のコードを使用して、特定のインスタンスが特定のタイプのタイプであるかどうかをいつでも確認できます。

        if( selectedPerson instanceof Student)
        ...
于 2011-01-24T08:05:18.703 に答える