2012-05-25 21 views
10

Khi xác định các lớp học, R có bất kỳ khái niệm nào về các vùng riêng tư và công cộng không?Các khe công cộng và riêng tư trong R?

Nếu không có tính năng nghiêm ngặt cho điều này bằng ngôn ngữ, có một lược đồ đặt tên chung không?

Trả lời

14

EDIT:

Để cung cấp cho một chút lịch sử: Trong setClass hoạt động 'tiếp cận' một tùy chọn được cung cấp để tạo ra cái gọi là 'khe đặc quyền' mà chỉ có thể được truy cập thông qua getter và setter cung cấp cùng với lớp . Điều này sẽ cho phép tạo ra các khe riêng (bằng cách không cung cấp một getter), nhưng tính năng này chưa bao giờ được thực hiện. Các trang trợ giúp của ?setClass hiện lần đọc:

truy cập và phiên bản, bao gồm để tương thích với S-Plus, nhưng hiện bỏ qua.


Vì vậy, không có những điều như khe tư nhân và công cộng, như thông qua các ký hiệu @ mỗi khe có thể truy cập. Và cá nhân tôi rất hài lòng với điều đó, vì nó cho phép tôi sử dụng thông tin từ các đối tượng không dễ dàng tiếp cận bằng cách sử dụng getters và setters có trong gói. Nó cũng cho phép tôi tiết kiệm được các phép tính nặng bằng cách tránh các chi phí do getters và setters tạo ra.

Tôi không biết về bất kỳ quy ước đặt tên nào để phân biệt giữa các vùng công khai và "riêng tư". Bạn có thể tạo sự khác biệt cho chính mình bằng cách đặt trước các vị trí "riêng tư" với dấu chấm, nhưng điều đó không ảnh hưởng đến cách các vị trí đó hoạt động. Nó cũng không phải là thực tế phổ biến, như hầu hết các lập trình viên R không quan tâm đến các khe công cộng và tư nhân. Họ chỉ không cung cấp getters và setters cho các khe mà người dùng trung bình không nên tiếp cận.

Để đưa ra một ví dụ tầm thường: sau đây tạo ra một lớp với hai vị trí, và một trình lấy và đặt cho chỉ một vị trí.

setClass("Example", 
    representation(
    aslot = "numeric", 
    .ahiddenslot = "character" 
) 
) 

setGeneric("aslot", function(x) standardGeneric("aslot")) 

setMethod("aslot","Example",function(x){ 
    [email protected] 
}) 

setGeneric("aslot<-", function(x,value) standardGeneric("aslot<-")) 

setMethod("aslot<-","Example",function(x,value){ 
    [email protected] <- value 
    x 
}) 

Bạn cũng có thể thiết lập một phương pháp show mà chỉ cần không in ra khe ẩn:

setMethod("show","Example",function(object){ 
    cat("Example with value for aslot: ", [email protected],"\n") 
}) 

Điều này cho phép việc sử dụng bình thường sau:

> X <- new("Example",aslot=1,.ahiddenslot="b") 
> X 
Example with value for aslot: 1 
> aslot(X) 
[1] 1 
> aslot(X) <- 3 

Nhưng .ahiddenslot vẫn có thể truy cập:

> slot(X,".ahiddenslot") 
[1] "b" 
+1

T ông đặt tên quy ước của một "." có ý nghĩa, vì phần lớn tôi nghĩ rằng nó sẽ giúp tôi giữ cho mọi thứ thẳng về ý định của tôi bằng cách làm cho sự khác biệt. Tôi không thực sự quan tâm nếu họ được bảo vệ. –

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