внутри функции явно проверяется тип, а это значит, что поведение определяется...

внутри функции явно проверяется тип, а это значит, что поведение определяется не типом, а сама функция решает как себя вести. как-то эта фраза не вяжется с итоговым решением упражнения. понадобится добавить новый интерфейс в виде методов isuser и isguest. если будет больше ролей, то на первый взгляд у нас сразу появляются флаги для сущности. в каждом классе писать методы на каждую роль? мне кажется это не самый удачный пример. и хотя кода меньше не стало, всё же это полиморфизм подтипов. код завязан на методы, а не на типы. изменение структуры классов не коснётся этой функции, если сама логика останется той же. как только там будет роль + еще какое-то состояние, то всё. тоска печаль с этими флаговыми методами. 

у мг такой же возник вопрос, мы же завязались на флаги и теперь нам надо не забыть везде добавить флаги проверки на каждую роль


конечно нужно не забывать, тут выбора нет. в статическом языке это заставил бы сделать компилятор. главное что мы теперь завязаны на интерфейс, а не на название типа. при таком подходе вам достаточно реализовать новый метод и все. места где он используется останется не тронутым. при завязке на имя класса придется поправить все места где есть такая проверка.