最简单的方法是将isTeacher()方法添加到person类。
这是一个基本的实现(你已经写过的部分遗漏了)
abstract class Person {
public abstract boolean isTeacher();
}
class Teacher extends Person {
public boolean isTeacher() { return true; }
}
class Student extends Person {
public boolean isTeacher() {return false; }
}
abstract class Session {
public void enroll(Person p) {
if (p.isTeacher()) teachers.add((Teacher)p);
else student.add((Student)p);
}
}
如果你也想避免类型转换,试试这个......
abstract class Person {
public abstract Teacher asTeacher();
public abstract Student asStudent();
}
class Student extends Person {
public Student asStudent() { return this; }
public Teacher asTeacher() { return null; }
}
class Teacher extends Person {
public Student asStudent() { return null; }
public Teacher asTeacher() { return this; }
}
class Session extends Person {
public void enroll(Person p) {
Teacher t = p.asTeacher();
if (t != null) teachers.add(t);
else students.add(p.asStudent());
}
}
这种实现有一个小的弱点,它假设教师和学生是唯一的类型,但将其扩展到多种类型是相当简单的。