仅在 oop 中将一个方法的范围限制为另一个 class

Limit the scope of a method to one other class only in oop

这是办公室里员工和他的经理之间的一个简单场景。 在现实世界中,经理可以管理很多员工,但为了简单起见 在这里考虑一名员工和他的经理之间的情况

这里经理和员工都有姓名属性

只有员工有指定属性

对于上述场景,我创建了这个 Class 图

使用 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;
    }

}

但是

  1. 在这里我将 Employee.changeName() 方法设为私有以防止经理更改员工姓名是否正确?
  2. changeDesignation() 方法在 Employee class 中既可以访问 Employee class 也可以访问 Manager class这表示 经理可以更改员工的指定,员工也可以更改 his/her 的指定,我想防止这种情况发生,让经理是唯一能够更改员工 designation.how 以在代码中实现它的人?

嗯,在这种情况下需要考虑一些事情。尽管如果您将其视为现实世界的实体,这很有意义,但让一个对象更改另一个对象的状态通常不是一个好的 OO 实践。

也就是说,如果您不希望任何其他 class 更改一个 class' 属性,您应该将字段设为私有并且不提供 setter完全没有。

至于指定,你不能真正阻止一个对象修改它的属性,除非它是最终的,但经理也不能改变它。

我想你可以有一个指定 class,并使其只有经理才能实例化它。但即便如此,员工也可以将其设置为空。

或者您可以让指定 class 保存对一个或多个员工的引用,然后只有经理可以访问指定对象。

正如我所说,我认为这是 OO 建模并不真正适合现实世界的时代之一。 类 应该对自己的状态负责,对任何状态的变化都有自己的一套规则。任何其他 class 应该只能询问或请求更改。

希望对您有所帮助!

好吧,我不知道域或在什么上下文中询问,但名称应该是构造函数的一部分,而不是操作的参数。有 "might" 个可以更改名称的原因。但在现实世界中,一个对象在创建时就被命名,并一直保留到最后。私人 changeName 似乎毫无意义。

对于第二个项目符号,您需要添加一个约束,例如 { can only be invoked by Manager instances }