首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅在oop中将方法的范围限制为另一个类。

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

Stack Overflow用户
提问于 2018-10-16 05:34:54
回答 2查看 209关注 0票数 1

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

在这里,经理和雇员都有name属性。

  • 经理只能改名。
  • 雇员只能更改姓名。

只有员工具有指定属性。

  • 名称只能由马槽改变。

在上面的场景中,我创建了这个类图

使用java代码实现上述场景,如下所示(请注意这段代码是伪代码,也是编组代码不包括,语法可能是错误的)

代码语言:javascript
复制
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类中既可以访问Employee类本身,也可以访问Manager类,这意味着经理可以更改对员工的指定,员工也可以更改自己的指定,我想要防止这种情况发生,使经理能够更改员工designation.how以在代码中实现吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-16 06:08:19

嗯,在这个场景中有一些事情要考虑。尽管如果您认为是真实世界的实体,这是很有意义的,但让对象改变另一个对象的状态通常不是一个好的OO实践。

尽管如此,如果您不希望任何其他类更改一个类的属性,则应该将字段设置为私有,并且根本不提供setter。

至于指定,您不能真正阻止对象修改它的属性,除非它是最终的,但是管理器也不能更改它。

我认为您可以有一个指定类,并使其只有管理器才能实例化它。但即使这样,员工也可以将其设置为空。

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

正如我说过的那样,我认为这是OO建模不适合真实世界的时候之一。类应该对自己的状态负责,并为任何状态更改保留自己的规则集。任何其他类都只能请求或请求更改。

希望能帮上忙!

票数 1
EN

Stack Overflow用户

发布于 2018-10-16 15:13:14

好吧,我不知道域或您询问的上下文,但是名称应该是构造函数的一部分,而不是操作的参数。“可能”是一个人可以改变名字的原因。但在现实世界中,一个对象是在创建时命名的,并将这个名称保留到最后。一个私人的changeName似乎毫无意义。

对于第二个项目,您需要添加一个像{ can only be invoked by Manager instances }这样的约束。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52828538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档