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

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

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

class User(string username, string password){...}

class UserAdmin(string username, string password) extends User{
   ...
   // new methods
}

class User(string username, string password) extends User{
   ...
   // new methods
}

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

public User login(String userName, String password) {
    for (User user : usersList) {
        if (user.isCorrectLogin(userName, password)) {
            return user;
        }
    }
    throw new RuntimeException("Login failed !");
}

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

ivqmmu1c

ivqmmu1c1#

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

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

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

User user = login(username, password);
if (user instanceof UserAdmin) {
  // Do privileged action
}

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

// User
public Set<String> getRoles() {
  return Set.of("user");
}

// UserAdmin
public Set<String> getRoles() {
  return Set.of("user", "admin");
}

那么你的逻辑就会变成:

User user = login(username, password);
if (user.getRoles().contains("admin")) {
  // Privileged action
}

相关问题