У меня есть общий Person
класс, и два типа людей Student
и Teacher
что расширяет Person
класс. У меня также есть учебные занятия, в которых будет храниться список студентов и список учителей, которые будут в этом сеансе.Перегруженные методы, которые обрабатывают подклассы некоторого абстрактного класса
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
в любой момент времени в моем собственном коде?
Просто для полноты, и не особенно хороший способ это сделать, но я должен упомянуть только о том, чтобы просто добавить его и добавить «ClassCastException». Вы сделали бы это, полагая, что учеников больше, чем учителей, поэтому учителя - это те, кто бросает исключение. –
В чем вред при использовании Generics здесь? – NINCOMPOOP
Да, я обновил этот пример, чтобы отразить идею о том, что в списке учеников будут храниться экземпляры «Студент», а список учителей будет содержать только экземпляры «Учитель». – MxyL