你如何改变类似的对象类型?

时间:2017-11-02 06:04:24

标签: java

User.java(抽象类)

public abstract class User {

  private int id;

  public int getId() {
    return this.id;
  }

  public void setId(int id) {
    this.id = int;
  }
}

Admin.java

public class Admin extends User {

  public Admin(int id) {
    super.setId(id);
  }

  public void promoteEmployee(Employee employee) {
    // How would I change the employee object into an admin object? 
  }

}

Employee.java

public class Employee extends User {

  public Employee(int id) {

    super.setId(id);

  }


}

基本上在方法promoteEmployee中,它接收Employee对象并使其成为管理对象。你会怎么做?

基本上

Employee employee = new Employee();

我想要转变为

Admin employee = new Admin();

3 个答案:

答案 0 :(得分:1)

此问题主要属于patterns

首先。您可以使用 Builder Pattern 根据Employee创建新的Admin。 (例如,使用new Employee(admin)

第二。您可以对oneAdmin使用Employee课程,并使用 State Pattern Admin更改为Employee。在此,您不会创建新对象,并且能够快速更改两个方向上的对象(或者您可能有更多User实例。

这两种方法都有优点和反差。一切都取决于你的目标。在我的实践中,Admin是具有额外权限的Employee,因此我认为boolean admin的{​​{1}}参数对于大多数情况都足够了。

答案 1 :(得分:0)

不可能将子类强制转换为另一个子类。 但是,您可以利用它们扩展相同的父类。 让每个人都成为User

User bob = new Employee(2);
User manager = new Admin(1);
bob = new Admin(bob.getId()) // this works!

答案 2 :(得分:0)

此处EmployeeAdmin都是User的子类。在班级EmployeeAdmin之间没有任何关系(IS-A关系)。

EmployeeAdmin类的对象可以由类User引用变量保存。但在EmployeeAdmin之间无法做到这一点。

因此,您在代码中编写的任何代码都将实现您想要的目标。

现在,我建议您对代码进行一些更改,以便在下次编辑中实现目标。

public class Admin extends Employee { // change the super class from User to Employee.

  public Admin(int id) {
    super.setId(id);
  }

  public void promoteEmployee(Employee employee) {
    // How would I change the employee object into an admin object? 
  }

}

现在,这是AdminEmployee之间的关系。这是AdminEmployee之间的正确关系。因为每个Admin都是Employee类型。