java—用继承获得正确的返回类的好做法是什么?

wqnecbli  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(322)

我有不同类型的用户,它们都继承自父类用户:

  1. class User(string username, string password){...}
  2. class UserAdmin(string username, string password) extends User{
  3. ...
  4. // new methods
  5. }
  6. class User(string username, string password) extends User{
  7. ...
  8. // new methods
  9. }

我有一个登录的方法,但问题是,如果我用useradmin的凭据登录,我想返回useradmin,对于user的所有其他子类也是一样的。

  1. public User login(String userName, String password) {
  2. for (User user : usersList) {
  3. if (user.isCorrectLogin(userName, password)) {
  4. return user;
  5. }
  6. }
  7. throw new RuntimeException("Login failed !");
  8. }

我该怎么做?我应该为每种类型的用户提供多个login()方法吗?或者有没有一种不同的方法来设计用户,让他们一开始就不存在这个问题?

ivqmmu1c

ivqmmu1c1#

对于您的用例来说,一个单一的登录方法应该很好,但是您应该做的是确保正确的登录类型 User 已经在 usersList . 例如:

  1. List<User> usersList = new ArrayList<>();
  2. usersList.add(new User("steve", "some_secret_password"));
  3. usersList.add(new UserAdmin("bob", "some_even_more_secret_password"));

这样,你现有的 login 方法将自动返回正确的类型。
如果要检查返回值是否属于特定类型,可以使用 instanceof 操作员:

  1. User user = login(username, password);
  2. if (user instanceof UserAdmin) {
  3. // Do privileged action
  4. }

不过,还有其他几种方法可以做到这一点。您可以简单地让每个特定的用户类型返回它所拥有的一组角色,这样您就可以避免 instanceof 总共:

  1. // User
  2. public Set<String> getRoles() {
  3. return Set.of("user");
  4. }
  5. // UserAdmin
  6. public Set<String> getRoles() {
  7. return Set.of("user", "admin");
  8. }

那么你的逻辑就会变成:

  1. User user = login(username, password);
  2. if (user.getRoles().contains("admin")) {
  3. // Privileged action
  4. }
展开查看全部

相关问题