2011-11-16 11 views
10

में निजी सदस्य क्या आर संदर्भ संदर्भ के अंदर निजी सदस्य फ़ील्ड होना संभव है। मेरे कुछ ऑनलाइन उदाहरणों के साथ खेलना मेरे पास है:आर संदर्भ कक्षा

> Account <- setRefClass( "ref_Account" 
>  , fields = list(
>  number = "character" 
>  , balance ="numeric") 
>  , methods = list( 
>  deposit <- function(amount) { 
>  if(amount < 0) { 
>   stop("deposits must be positive") 
>  } 
>  balance <<- balance + amount 
>  } 
>  , withdraw <- function(amount) { 
>  if(amount < 0) { 
>   stop("withdrawls must be positive") 
>  } 
>  balance <<- balance - amount 
>  }  
> )) 
> 
> 
> tb <- Account$new(balance=50.75, number="baml-029873") tb$balance 
> tb$balance <- 12 
> tb$balance 

मुझे इस तथ्य से नफरत है कि मैं सीधे संतुलन को अपडेट कर सकता हूं। शायद मेरे में पुराना शुद्ध ओओ, मैं वास्तव में कक्षा के बाहर से कम से कम गैर-सेटटेबल, निजी संतुलन बनाने में सक्षम होना चाहता हूं।

विचार

+0

आर 6-पैकेज/ढांचे में निजी क्षेत्र और विधियां हैं (और अधिक प्रदर्शन करने का दावा किया जाता है)। – petermeissner

उत्तर

3

यह उत्तर आर> 3.00 के साथ काम नहीं करता है, इसलिए इसका उपयोग न करें!

जैसा कि उल्लेख किया गया है, आपके पास निजी सदस्य फ़ील्ड नहीं हो सकते हैं। हालांकि, यदि आप प्रारंभिक विधि का उपयोग करते हैं, तो शेष राशि फ़ील्ड के रूप में प्रदर्शित नहीं होती है।

tb <- Account$new(balance=50.75, number="baml-0029873") 
##No balance 
tb 

Reference class object of class "ref_Account" 
Field "number": 
[1] "baml-0029873" 

मैं उल्लेख किया है, यह वास्तव में निजी नहीं है, जब से तुम अब भी कर सकते हैं: उदाहरण के लिए,

Account = setRefClass("ref_Account", 
         fields = list(number = "character"), 
         methods = list(
          initialize = function(balance, number) { 
           .self$number = number 
           .self$balance = balance 
          }) 

पहले की तरह, हम एक उदाहरण बना देंगे

R> tb$balance 
[1] 50.75 
R> tb$balance = 12 
R> tb$balance 
[1] 12 
2

आर ऐसी भाषा नहीं है। निजी या सार्वजनिक की कोई धारणा नहीं है।

+0

मैं ब्याज के साथ डाउनवोट नोट करता हूं। अगर मुझे यह गलत लगता है तो कृपया मुझे बताएं कि कैसे। –

+0

मुझे लगता है कि सोमवार मैसेंजर शूटिंग कर रहा है। आर के भीतर कक्षाओं का मूल्य क्या है यदि वे मुझे राज्य को समाहित करने और नियंत्रित करने की अनुमति नहीं देते हैं? या – akaphenom

+1

को हल करने के इरादे से वे (वर्ग) अलग-अलग वाक्यांशों का मूल्यांकन करते थे, फिर भी पहुंच सुरक्षा के बिना ओओपी में अभी भी मूल्य है। मुझे लगता है कि सिर्फ एक अलग मानसिकता की जरूरत है। –

2

गोपनीयता के मुद्दे को हल करने के लिए मैं अपनी खुद की कक्षा, "निजी" बनाता हूं, जिसमें ऑब्जेक्ट तक पहुंचने के लिए नए तरीके हैं, यानी $ और [[। यदि क्लाइंट 'निजी' सदस्य तक पहुंचने का प्रयास करता है तो ये विधियां एक त्रुटि फेंक देंगी। निजी सदस्य को नाम (अग्रणी अवधि) द्वारा पहचाना जाता है। संदर्भ ऑब्जेक्ट्स आर में वातावरण हैं, इसके आसपास काम कर सकते हैं, लेकिन इस समय मेरा समाधान है और मुझे कक्षा द्वारा प्रदान की गई/सेट विधियों का उपयोग करने के लिए अधिक सुविधाजनक लगता है। तो सवाल के लिए यह 'हार्ड-टू-सेट-द-द-क्लास' समाधान है।

मैंने इसे आर-पैकेज के अंदर व्यवस्थित किया है, इसलिए निम्न कोड उस पैकेज का उपयोग करता है और उपरोक्त उदाहरण को संशोधित करता है जैसे कि tb$.balance पर एक असाइनमेंट त्रुटि उत्पन्न करता है। मैं फ़ंक्शन Class का भी उपयोग करता हूं जो setRefClass के आस-पास एक रैपर है, इसलिए यह अभी भी विधियों के पैकेज द्वारा प्रदान किए गए आर के संदर्भ कक्षाओं के दायरे में है और प्रश्न में उपयोग किया जाता है।

devtools::install_github("wahani/aoos") 
library("aoos") 

Account <- defineRefClass({ 
    Class <- "Account" 
    contains <- "Private" 

    number <- "character" 
    .balance <- "numeric" 

    deposit <- function(amount) { 
     if(amount < 0) stop("deposits must be positive") 
     .balance <<- .balance + amount 
    } 

    withdraw <- function(amount) { 
     if(amount < 0) stop("withdrawls must be positive") 
     .balance <<- .balance - amount 
    } 
}) 

tb <- Account(.balance = 50.75, number = "baml-029873") 
tb$.balance # error 
tb$.balance <- 12 # error 
संबंधित मुद्दे