2009-08-31 38 views
17

Để đối phó với What is your longest-held programming assumption that turned out to be incorrect? câu hỏi, một trong những giả định sai là:Bạn có thể giải thích điều này về đóng gói?

Đó biến thành viên private là tin để thể hiện và không phải là lớp .

(Link)

tôi không thể nắm bắt những gì anh ấy nói về, bất cứ ai có thể giải thích những gì là sai/đúng về điều đó với một ví dụ?

+0

Cách này liên quan đến đóng gói? – p4bl0

+6

khả năng hiển thị riêng là cách đóng gói được thực hiện bằng các ngôn ngữ như Java, C++ và C# –

+1

@ p4bl0 Cách đóng gói và phạm vi biến có liên quan như thế nào? Khá cơ bản. – meagar

Trả lời

35
public class Example { 
    private int a; 

    public int getOtherA(Example other) { 
    return other.a; 
    } 
} 

Như thế này. Như bạn có thể thấy, private không bảo vệ cá thể thành viên khỏi bị truy cập bởi một cá thể khác.

BTW, đây không phải là tất cả xấu miễn là bạn là một chút cẩn thận. Nếu riêng tư sẽ không hoạt động như trong ví dụ trên, nó sẽ là cồng kềnh để viết bằng() và các phương thức như vậy.

+3

Vì vậy, các thành viên riêng tư là riêng tư cho lớp học, và một cá thể có thể truy cập thành viên riêng của một cá thể khác, đúng không? –

+0

Đúng vậy. –

+0

OK, cảm ơn rất nhiều! –

2

Ví dụ mã (Java):

public class MutableInteger { 
    private int value; 

    // Lots of stuff goes here 

    public boolean equals(Object o) { 
     if(!(o instanceof MutableInteger)){ return false; } 
     MutableInteger other = (MutableInteger) o; 
     return this.value == other.value; // <------------ 
    } 
} 

Nếu giả định "biến thành viên tư nhân tới các trường hợp" là đúng, dòng đánh dấu sẽ gây ra một lỗi biên dịch, bởi vì lĩnh vực other.value là tư nhân và một phần của một đối tượng khác với đối tượng có phương thức equals() đang được gọi.

Nhưng vì trong Java (và hầu hết các ngôn ngữ khác có khái niệm hiển thị) private mức hiển thị là mỗi lớp, quyền truy cập vào trường được phép cho tất cả mã của MutableInteger, không liên quan đến trường hợp nào được sử dụng để gọi nó.

+2

"và tất cả các ngôn ngữ khác có khái niệm hiển thị, tôi nghĩ" Trong ruby ​​riêng là mỗi đối tượng. – sepp2k

+0

Cảm ơn thông tin, Michael. –

+0

Trong Scala bạn có thể thêm ngữ cảnh: riêng tư [this] – egaga

3

Dưới đây là tương đương với Michael Borgwardt's answer cho khi bạn đang không thể truy cập vào các lĩnh vực cá nhân của đối tượng khác:

public class MutableInteger { 
    private int value; 

    // Lots of stuff goes here 

    public boolean equals(Object o) { 
     if(!(o instanceof MutableInteger)){ return false; } 
     MutableInteger other = (MutableInteger) o; 
     return other.valueEquals(this.value); // <------------ 
    } 

    @Override // This method would probably also be declared in an interface 
    public boolean valueEquals(int oValue) { 
     return this.value == oValue; 
    } 
} 

Ngày nay đây là quen thuộc đối với các lập trình viên Ruby nhưng tôi đã làm điều này trong Java cho một lúc. Tôi không muốn dựa vào quyền truy cập vào các lĩnh vực riêng của đối tượng khác. Hãy nhớ rằng đối tượng khác có thể thuộc về một lớp con, có thể lưu trữ giá trị trong trường đối tượng khác hoặc trong tệp hoặc cơ sở dữ liệu, v.v.

Các vấn đề liên quan