这是在员工与其经理之间的办公室中的一个简单场景。
在现实世界中,经理可以管理许多员工,但是为了简单起见
在这里考虑一位员工与其经理之间的情况
在这里经理和员工都具有名称属性
只有雇员具有指定属性
对于上述情况,我创建了这个类图
使用Java代码实现上述情况,如下所示 (请注意,此代码为伪代码,并且不包含编排代码,语法可能是错误的)
class Manager{
private String name;
private Employee employee;
//assign name and create association link between employee
Manager(Employee employee,String managerName ){
this.employee = employee;
this.name = managerName;
}
//manager can change his name
private void changeName(String managerName){
this.name = managerName;
}
//only manager can change Employee designation
private void changeEmpDesignation(String empDesignation){
this.employee.changeDesignation(empDesignation);
}
}
/* --------------------------- */
class Employee{
private String name;
private String designation;
Employee(String name ,String designation ){
this.designation = designation;
this.name = name;
}
//only Employee can change his name
private void changeName(String empName){
this.name = empName;
}
//only manager can change Employee designation
public void changeDesignation(String empDesignation){
this.designation = empDesignation;
}
}
但是
Employee.changeName()
方法设为私有,以防止经理更改员工姓名是否正确?changeDesignation()
方法在Employee
类中,可以自己访问Employee
类,也可以访问Manager
类,这意味着
经理可以更改员工的指定,而员工也可以更改他/她的指定,我想防止这种情况的发生,并使经理成为唯一可以更改员工指定的人。如何在代码中实现?答案 0 :(得分:1)
在这种情况下,有一些事情要考虑。即使您将其视为现实世界实体很有意义,但让一个对象更改另一个对象的状态通常不是一个好的OO实践。
话虽如此,如果您不希望任何其他班级更改一个班级的属性,则应将该字段设为私有,并且完全不提供设置器。
关于名称,除非是最终的,否则您不能真正阻止对象修改其属性,但是经理也无法更改它。
我想您可以拥有一个Designation类,并使其成为仅管理员可以实例化的类。但是即使那样,员工也可以将其设置为null。
或者您可以让Designation类持有对一个或多个员工的引用,那么只有管理者才能访问这些指定对象。
正如我所说,我认为这是OO建模并不真正适合现实世界的时期之一。类应负责其自身的状态,并对任何状态更改都拥有自己的一组规则。其他任何班级都只能要求或要求更改。
希望有帮助!
答案 1 :(得分:1)
好吧,我不知道您要查询的域或上下文,但是名称应是构造函数的一部分,而不是操作的参数。有可能更改名称的原因。但是在现实世界中,对象是在创建时被命名的,并一直保留到最后。私有changeName
似乎毫无意义。
对于第二个项目符号,您需要添加约束{ can only be invoked by Manager instances }
。