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"。
这允许您在配置文件中创建无限数量的角色组合。使用多态方法,您必须在代码中定义每一个。每次用户角色更改时都必须更改代码并进行发布,这会大大增加您的维护成本。
所以我正在制作一个带有登录名的系统,根据用户的类型为用户提供不同的选项。
例如
我想知道如何让系统在登录时区分两者。我是否为用户 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"。
这允许您在配置文件中创建无限数量的角色组合。使用多态方法,您必须在代码中定义每一个。每次用户角色更改时都必须更改代码并进行发布,这会大大增加您的维护成本。