Java 继承 如何区分程序中的用户类型?

Java inheritance How to differentiate type of user in a program?

所以我正在制作一个带有登录名的系统,根据用户的类型为用户提供不同的选项。

例如

我想知道如何让系统在登录时区分两者。我是否为用户 class 对每种类型的用户进行布尔类型检查?

例如 booleanUser1Check() 和 booleanUser2Check()

或用户类型 id 属性。

就 oop 而言,执行此操作的最佳方法是什么?

实现您想要的一个有趣的方法是利用多态性,即一个对象具有多种形式的能力。除其他事项外,此功能允许父 class 引用变量引用其子 class 之一的实例。请参阅下面的操作方法。

创建一个摘要class,它将为所有用户定义默认结构:

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();
}

请注意,您可以在那里声明抽象和非抽象方法。现在,为每种类型的用户创建一个 class:

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 的所有 class 都必须实现其抽象方法(在本例中为 doSomething())。现在,如果您真的需要知道用户的类型,请使用运算符 instaceof 检查类型 User 的变量是否包含 class 以上。请参阅下面的示例:

User user = ...
if(user instanceof NormalUser) {
    //user is a normal user
} 
//...

但是,请注意,更好、更面向对象的设计是让父级 class 处理用户所需的一般操作,让子级 class es填写细节。在上面的示例中,所有用户都可以执行 doSomething() 定义的操作,但每个用户的操作都不同。由于每个用户类型以不同方式实现此方法,因此您可以在不知道用户是什么类型的情况下使用它。

通过这种方式,您可以将行为封装在 User 及其子 class 中,以便不同用户使用的代码是相同的,即使他们的行为不同。见下文:

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

如果您查看现有的授权框架,您会注意到其中 none 使用多态性来定义访问控制限制。相反,每个用户都由相同 class 的实例表示,并且该实例具有定义用户访问权限的属性。这些属性通常称为角色,它们代表现实生活中的人类角色,如管理员、用户、销售主管等。

在大多数系统中,一个用户甚至可以拥有多个角色,例如,如果一个用户同时是 "developer" 和 "manager"。

这允许您在配置文件中创建无限数量的角色组合。使用多态方法,您必须在代码中定义每一个。每次用户角色更改时都必须更改代码并进行发布,这会大大增加您的维护成本。