在员工和经理之间的办公室里,这是一个简单的场景。在实际世界中,经理可以管理许多员工,但为了简单起见,这里考虑一下一名员工和他的经理之间的情况。
在这里,经理和雇员都有name属性。
只有员工具有指定属性。
在上面的场景中,我创建了这个类图

使用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类,这意味着经理可以更改对员工的指定,员工也可以更改自己的指定,我想要防止这种情况发生,使经理能够更改员工designation.how以在代码中实现吗?发布于 2018-10-16 06:08:19
嗯,在这个场景中有一些事情要考虑。尽管如果您认为是真实世界的实体,这是很有意义的,但让对象改变另一个对象的状态通常不是一个好的OO实践。
尽管如此,如果您不希望任何其他类更改一个类的属性,则应该将字段设置为私有,并且根本不提供setter。
至于指定,您不能真正阻止对象修改它的属性,除非它是最终的,但是管理器也不能更改它。
我认为您可以有一个指定类,并使其只有管理器才能实例化它。但即使这样,员工也可以将其设置为空。
或者可以让指定类保存对一个或多个员工的引用,然后只有经理才能访问指定对象。
正如我说过的那样,我认为这是OO建模不适合真实世界的时候之一。类应该对自己的状态负责,并为任何状态更改保留自己的规则集。任何其他类都只能请求或请求更改。
希望能帮上忙!
发布于 2018-10-16 15:13:14
好吧,我不知道域或您询问的上下文,但是名称应该是构造函数的一部分,而不是操作的参数。“可能”是一个人可以改变名字的原因。但在现实世界中,一个对象是在创建时命名的,并将这个名称保留到最后。一个私人的changeName似乎毫无意义。
对于第二个项目,您需要添加一个像{ can only be invoked by Manager instances }这样的约束。
https://stackoverflow.com/questions/52828538
复制相似问题