簡體   English   中英

這是封裝嗎?

[英]Is this encapsulation?

我讀了很多次關於封裝的文章,但我總是看到這樣的代碼,我想知道同樣的事情。 是這種封裝嗎?

class create_active_parent{



function __construct(){
     //something
}


function clean_queues_redis(){
    //creating in this way an object, and using it, is not encapsulation, is it?
    $redis = RedisDB::fetch_instance();        
    $redis->db->flushdb();  
}

封裝是對外部隱藏私有字段 $redis只是一個局部變量,它會在clean_queues_redis方法執行結束時clean_queues_redis

關於封裝:

想象一個管理來自一組人(例如,一些大公司或銀行)的敏感數據的應用程序,我們可以編寫以下類來說明我們如何處理這些信息。

public class Test {
    public static void main(String args[]) {
        CarbonBasedLifeform joeBloggs = new CarbonBasedLifeform("Joe Bloggs", "987-65-4320");
        System.out.println(joeBloggs.name);
    }
}
class CarbonBasedLifeform {
    String name;
    String SSN;
    public CarbonBasedLifeform(String name, String SSN)
    {
        this.name = name;
        this.SSN = SSN;     
    }
}

如果你運行這段代碼,你將創建一個名為“CarbonBasedLifeform”的類,並創建一個實例,Joe Bloggs,現在想象其他一些程序員正在向程序添加更多的東西,他們開始處理這些數據中的一些,如果他們更改 Joe 的社會安全號碼? 甚至他的名字? 我們沒有任何東西來保護對類屬性的訪問,所以很容易做到:

joeBloggs.SSN = "0987654321";

如果人們可以像這樣修改彼此的文件並更改個人數據,那將是一個多么奇怪、令人不安的世界。 Joe 是唯一一個可以通過官僚循環獲取新文檔的人,這些東西是私有的,這就是為什么將修飾符添加到類屬性以及特殊方法來控制對其值的訪問是一種常見做法,即,吸氣劑和吸氣劑:

class CarbonBasedLifeform {
    private String name;
    private String SSN;
    public CarbonBasedLifeform(String name, String SSN) {
        this.name = name;
        this.SSN = SSN;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSSN() {
        return this.SSN;
    }
    public void setSSN(String SSN) {
        if(verifyRedTape())
            this.SSN = SSN;
        }
    }
}

現在,其他類不能直接更改 Joe 的屬性,因為這些屬性被標記為private並且這些方法提供了一種機制來控制其他類如何與這些數據交互,這稱為封裝,或者換句話說,不要觸摸喬的私處!

暫無
暫無

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

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