Несмотря на то, что все объекты, добавленные в массив, сохраняют свой "настоящий" класс, программа работает с ними как с объектами класса User
. Этого вполне достаточно, чтобы можно было найти нужного пользователя по логину и паролю (ведь метод enter()
у них общий) и присвоить найденный объект переменной currentUser
типа User
. В этой переменной хранится текущий пользователь, авторизовавшийся в системе.
Предположим, нам известно, что переменная currentUser
сейчас ссылается на объект класса Member
и текущий пользователь предлагает встретиться у фонтана в среду с 17 до 19 часов. Необходимо вызвать метод addRequest()
, но у нас не получится сделать это командой
currentUser.addRequest("Фонтан", 3, 17, 19);
поскольку в классе User
нет метода addRequest()
.
Однако мы можем осуществить явное преобразование переменной currentUser
к типу Member
. Такое преобразование (переход от менее конкретного типа к более конкретному) называется сужением. Явное преобразование делается с помощью оператора, представляющего собой имя целевого типа в скобках.
((Member)currentUser).addRequest("Фонтан", 3, 17, 19);
Здесь мы, прежде чем вызвать метод addRequest()
, преобразовали переменную currentUser
к типу Member
. Нам было позволено сделать это, поскольку Member
является потомком User
. Однако, если бы во время выполнения программы оказалось, что на самом деле переменная currentUser
не ссылалась на объект класса Member
, в программе возникла бы ошибка.