需要对Manager和Employee类进行编码。如何在不破坏封装的情况下使它们彼此“可见”?

时间:2019-02-12 15:24:33

标签: java inheritance encapsulation

Manager类和Employee类都是EnterpriseMember的子类。如何为Employee类编写一个“ getManager”方法(该方法返回在其报告列表中具有该Employee的Manager实例)? 预先感谢!

public class Manager extends EnterpriseMember {

    /*Fields */
    private List reports = new ArrayList();

    /*Constructor */
    public Manager(String name){
        super(name);
    }

    /*Methods */
    public void addReport(Employee employee){            
        reports.add(employee);
    }// How can "employee" know it is in this List?

}

public class Employee extends EnterpriseMember {

    /*Constructor */
    public Manager(String name){
        super(name);
    }

    /*Methods */
    public Manager getManager(){            
        return ???;
    }

}

2 个答案:

答案 0 :(得分:4)

类似的东西:

public class Manager {

    private List<Employee> reports = new ArrayList<Employee>();

    public void addReport(Employee e) {
        if (e != null) {
            this.reports.add(e);
            e.setManager(this);
        }
    }
}

public class Employee {

    private Manager manager;

    public void setManager(Manager m) {
        if (m != null) {
            this.manager = m;
        }
    }
}

以防万一,请添加所需的所有其他方法。我仅说明了如何将Manager中的Employee引用添加到直接报表的List中。

您还应该有一个removeReport方法,该方法将从Employee中删除List并将其Manager设置为null

您打算如何在此Employee中找到一个List?按名字?员工ID?提示:考虑为您的班级正确覆盖equalshashCode

Managers也不Employees吗?老板没有老板吗?这是一个层次结构,一棵树。

答案 1 :(得分:1)

通常,具有不同属性的对象如下所示:

public class Employee extends EnterpriseMember {

    private Manager manager;
    private String name; // You probably don't need this because you defined it in the Superclass.
    .
    .
    .

    /*Constructor */
    public Employee(String name){
        super(name);
    }

    /*Methods */
    public Manager getManager(){            
        return manager;
    }

    public void setManager(Manager manager){            
        this.manager = manager
    }

    // Other getters and setters for the attributes.

}