Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-以用户或管理员身份登录?遗产_Java_Arrays_Inheritance - Fatal编程技术网

Java-以用户或管理员身份登录?遗产

Java-以用户或管理员身份登录?遗产,java,arrays,inheritance,Java,Arrays,Inheritance,我的应用程序上有一个登录系统,其中包含一组预定义用户,如下所示: User user = new User("tommy", "tommy", false); User user2 = new User("phil2", "phil2", false); User user3 = new User("phil", "phil", true); Admin admin = new Admin("benji", "benji", true); 然后将它们添加到用户数组中 userArray.add

我的应用程序上有一个登录系统,其中包含一组预定义用户,如下所示:

User user = new User("tommy", "tommy", false);
User user2 = new User("phil2", "phil2", false);
User user3 = new User("phil", "phil", true);
Admin admin = new Admin("benji", "benji", true);
然后将它们添加到用户数组中

userArray.add(user);...
logIn()方法在尝试登录时循环并检查其凭据

用户可以按预期登录,但是我如何才能获得管理员帐户登录?注意管理员仍然是一个用户,只是一种特殊类型的用户,在登录时具有不同的菜单。当前该管理员帐户未被识别为用户

在我的用户类中,我有以下内容:管理员继承自用户,因为它是一个用户:

public class Admin extends User {           
    public Admin(String username, String password, boolean av) {
        super(username, password,av);
    }
LogIn()如下所示:

public void LogIn() {
    Scanner in = new Scanner(System.in);
    System.out.println(" Welcome to the system \n Enter your Username and Password to continue \n Username: ");
    String temp = in.nextLine();
    System.out.println(" Password: ");
    String temp2 = in.nextLine();

    //while(LOCount != 3){
    for (int i = 0; i < userArray.size(); i++) {
        if (userArray.get(i).CheckUsername(temp) && userArray.get(i).CheckPassword(temp2)) {
            // if(userArray.get(i) instanceof User.Admin){
            UserMenu();

我是新继承人,所以任何帮助我都会感激的,谢谢

您应该避免
的instanceof
。您可以这样做:

public interface Menu {
    void show();    
}

public class UserMenu implements Menu {
  @Override
  public void show() {
    //show user menu
  }
}

public class AdminMenu implements Menu {
  @Override
  public void show() {
    //show admin menu
  }
}

public class User {

   private String username;
   private String password;

   public Menu getMenu() {
     return new UserMenu();
   }

   public boolean authenticate(String username, String pass) {
       return this.username.equals(username) && this.password.equals(pass); 
   }
   //getters & setters
}

public class Admin extends User {
   //Constructor
   @Override
   public Menu getMenu() {
     return new AdminMenu();
   }
}
在您的
logIn()
方法中:

for (int i = 0; i < userArray.size(); i++) {
    User user = userArray.get(i);
    if (user.authenticate(username, password)) {
        user.getMenu().show();
        //for look must finish, maybe with break?
    }
}
for(int i=0;i

希望有帮助。

您应该避免使用
实例。您可以这样做:

public interface Menu {
    void show();    
}

public class UserMenu implements Menu {
  @Override
  public void show() {
    //show user menu
  }
}

public class AdminMenu implements Menu {
  @Override
  public void show() {
    //show admin menu
  }
}

public class User {

   private String username;
   private String password;

   public Menu getMenu() {
     return new UserMenu();
   }

   public boolean authenticate(String username, String pass) {
       return this.username.equals(username) && this.password.equals(pass); 
   }
   //getters & setters
}

public class Admin extends User {
   //Constructor
   @Override
   public Menu getMenu() {
     return new AdminMenu();
   }
}
在您的
logIn()
方法中:

for (int i = 0; i < userArray.size(); i++) {
    User user = userArray.get(i);
    if (user.authenticate(username, password)) {
        user.getMenu().show();
        //for look must finish, maybe with break?
    }
}
for(int i=0;i

希望有帮助。

你可以这样做

将login方法移动到user类可以使逻辑和属性保持抽象。重写Admin类中的login方法允许您执行其他检查

通过调用
super.login()管理员与普通用户具有完全相同的身份验证逻辑。通过使用
final boolean isAuthorized=isAllowedToDoThis()执行附加检查您可以检查管理员是否被允许执行上述操作

对于
getMenu()。由于重写了实现,因此只需调用
getMenu(),它将根据对象的类型加载用户或管理菜单

请注意,这只是一个抽象的布局,说明了如何实现它

public class User {

    private final String username;
    private final String password;
    private final boolean something;

    public User(String username, String password, boolean something) {
        this.username = username;
        this.password = password;
        this.something = something;
    }

    public boolean login() {
        return correctPassword && correctUsername
    }

    private boolean correctPassword() { }
    private boolean correctUsername() { }

    public Menu getMenu() {
        // Return User menu
    }
}


public class Admin extends User {

    public Admin(String username, String password, boolean something) {
        super(username, password, something);
    }

    @Override
    public boolean login() {
        final boolean isAuthenticated = super.login();
        final boolean isAuthorized = isAllowedToDoThis();
        return isAuthenticated && isAuthorized;
    }

    private boolean isAllowedToDoThis() { }

    @Override
    public Menu getMenu() {
        // Return Admin menu
    }
}

你可以这样做

将login方法移动到user类可以使逻辑和属性保持抽象。重写Admin类中的login方法允许您执行其他检查

通过调用
super.login()管理员与普通用户具有完全相同的身份验证逻辑。通过使用
final boolean isAuthorized=isAllowedToDoThis()执行附加检查您可以检查管理员是否被允许执行上述操作

对于
getMenu()。由于重写了实现,因此只需调用
getMenu(),它将根据对象的类型加载用户或管理菜单

请注意,这只是一个抽象的布局,说明了如何实现它

public class User {

    private final String username;
    private final String password;
    private final boolean something;

    public User(String username, String password, boolean something) {
        this.username = username;
        this.password = password;
        this.something = something;
    }

    public boolean login() {
        return correctPassword && correctUsername
    }

    private boolean correctPassword() { }
    private boolean correctUsername() { }

    public Menu getMenu() {
        // Return User menu
    }
}


public class Admin extends User {

    public Admin(String username, String password, boolean something) {
        super(username, password, something);
    }

    @Override
    public boolean login() {
        final boolean isAuthenticated = super.login();
        final boolean isAuthorized = isAllowedToDoThis();
        return isAuthenticated && isAuthorized;
    }

    private boolean isAllowedToDoThis() { }

    @Override
    public Menu getMenu() {
        // Return Admin menu
    }
}

显示您的登录()代码我现在将它添加到主要问题中。你的问题很奇怪,你在用JAAS吗?没有用JAAS,是什么让你困惑?对不起,我有时很难解释我的问题。你能为
CheckUsername
CheckPassword
方法添加代码吗?显示你的登录()代码我现在将它添加到主要问题中。你的问题很奇怪,你在用JAAS吗?没有用JAAS,是什么让你困惑?抱歉,我有时很难解释我的问题。您能为
CheckUsername
CheckPassword
方法添加代码吗?感谢您在声明Admin Admin=newAdmin(“ben”,“ben”,true)时的帮助;当声明Admin Admin=newAdmin(“ben”,“ben”,true)时,它无法识别用户中的Admin类;它无法识别用户中的Admin类?Admin无法解析为类型,因此我尝试从User类导入它,但当我这样做时,它会说导入用户无法解析?我真的不明白您的意思,但请确保将User和Admin都移动到它们自己的类文件中。其次,User和Admin类应该是公共的。如果这对你没有帮助,我需要更多的代码来看看有什么问题;当声明Admin Admin=newAdmin(“ben”,“ben”,true)时,它无法识别用户中的Admin类;它无法识别用户中的Admin类?Admin无法解析为类型,因此我尝试从User类导入它,但当我这样做时,它会说导入用户无法解析?我真的不明白您的意思,但请确保将User和Admin都移动到它们自己的类文件中。其次,User和Admin类应该是公共的。如果这对你没有帮助的话,我需要更多的代码来看看哪里出了问题。这是天才,因为它可以同时适用于控制台和GUI应用程序!通过一些添加,您可以处理与菜单交互相关的整个业务逻辑,所有这些逻辑都在
菜单
s或
用户
s中!这是天才,因为它可以同时适用于控制台和GUI应用程序!通过一些添加,您可以处理与菜单交互相关的整个业务逻辑,所有这些逻辑都在
菜单
s或
用户
s中!