簡體   English   中英

僅在oop中將方法的范圍限制為另一個類

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

在員工與其經理之間的辦公室中,這是一個簡單的場景。 在現實世界中,經理可以管理許多員工,但為簡單起見,在這里考慮一位員工與其經理之間的情況

在這里,經理和員工都有名稱屬性

  • 經理只能更改他的名字
  • 員工只能更改他的名字

只有員工具有指定屬性

  • 名稱只能由經理更改

對於上述情況,我創建了此類圖

在此處輸入圖片說明

如下所示,使用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類中,既可以自己訪問Employee類,也可以訪問Manager類,這意味着經理可以更改員工的指定,而員工也可以更改其指定,我想防止這種情況的發生,並且使經理是唯一的一個可以更改員工名稱的人。如何在代碼中實現它?

好吧,在這種情況下需要考慮一些事情。 即使將其視為現實世界實體很有意義,但讓一個對象更改另一個對象的狀態通常不是一個好的OO實踐。

話雖如此,如果您不希望任何其他類更改一個類的屬性,則應將該字段設為私有,並且完全不提供設置器。

至於名稱,除非是最終的,否則您不能真正阻止對象修改其屬性,但是經理也無法更改它。

我想您可以擁有一個Designation類,並使其成為僅管理員可以實例化的類。 但是即使那樣,員工也可以將其設置為null。

或者,您可以讓Designation類持有對一個或多個員工的引用,那么只有管理者才能訪問該Designation對象。

正如我所說的,我認為這是OO建模並不真正適合現實世界的時代之一。 類應負責其自身的狀態,並對任何狀態更改都擁有自己的一組規則。 其他任何班級都只能要求或要求更改。

希望能幫助到你!

好吧,我不知道您要查詢的域或上下文,但是名稱應是構造函數的一部分,而不是操作的參數。 有可能更改名稱的原因。 但是在現實世界中,對象是在創建時被命名的,並一直保留到最后。 私有的changeName似乎毫無意義。

對於第二個項目符號,您需要添加一個約束,例如{ can only be invoked by Manager instances }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM