Интересный способ достичь того, чего вы хотите, - это воспользоваться полиморфизмом , то есть способностью объекта принимать различные формы.Помимо прочего, эта функция позволяет ссылочной переменной родительского класса ссылаться на экземпляр одного из его дочерних классов.Ниже вы узнаете, как это сделать.
Создайте абстрактный класс, который определит структуру по умолчанию для всех пользователей:
public abstract class User
{
private String name;
private String email;
//...
//perform an action that must have a different behaviour for each user type
public abstract void doSomething();
}
Обратите внимание, что вы можете объявлять как абстрактные, так и неабстрактные методы.там.Теперь создайте класс для каждого типа пользователя:
public class Admin extends User
{
//...
@Override
public void doSomething() {
//action's behaviour for an admin
}
}
public class NormalUser extends User
{
//...
@Override
public void doSomething() {
//action for a normal user
}
}
public class PremiumUser extends User
{
//...
@Override
public void doSomething() {
//action for a premium user
}
}
Помните, что все классы, которые расширяет User
, должны реализовывать свои абстрактные методы (doSomething()
в этом случае).Теперь, если вам действительно нужно знать тип пользователя, используйте оператор instaceof , чтобы проверить, содержит ли переменная типа User
экземпляр одного из перечисленных выше классов.См. Пример ниже:
User user = ...
if(user instanceof NormalUser) {
//user is a normal user
}
//...
Обратите внимание, однако, что лучше и более объектно-ориентированный дизайн будет иметь родительский класс для обработки общих действий, необходимых для пользователя, и позволить дочерним классам заполнятьв специфике .В приведенном выше примере все пользователи могут выполнять действие, определенное doSomething()
, но это действие отличается для каждого пользователя.Поскольку каждый тип пользователя реализует этот метод по-своему, вы можете использовать его без необходимости знать, какой тип является пользователем.
Таким образом, вы инкапсулируете поведение в User
и его подклассах, так что код, используемый для разных пользователей, одинаков, хотя их поведение отличается.Смотрите ниже:
User user = ...
user.doSomething(); //perform different actions depending on the user's type. Notice that you do not need to know what type the user is in this case