2016-05-27 71 views
1

使用R6,我想強制一個方法返回一個特定的數據類型,這可能嗎?強制返回功能的類型

例如,考慮以下因素:

A = R6::R6Class("ClassA", 
    public=list(
     getx = function() as.integer(1) 
    ) 
) 
B = R6::R6Class("ClassB",inherit=A, 
    public = list(
     getx = function() "ABCDEF" 
    ) 
) 

如果我想執行的功能getx()返回一個整數,A的一個實例是好的,但我想阻止一個子類從返回不同的類型例如B的情況。換句話說,我希望函數在返回的內容中保持一致,而不管它實際實現的位置。

回答

1

您可以使用解決方法來做到這一點。直接這是不可能的,間接使用第二個功能,它是。

當您在「ClassB」中定義新的「getx」函數時,這完全隱藏了A類函數「getx」。R6中沒有機制確保任何返回值必須通過特定函數。

現在 - 你可以做的是:從ClassA的

設的getX是公共職能。它所做的只是調用實際返回值的私有函數p_getx,getx只是將其強制轉換爲正確的類型。

然後,任何實現從ClassA繼承的ClassB的用戶都將保持公共函數getx不變,而是實現私有方法p_getx。這是「克隆」方法使用w.r.t的模型。私有'deep_clone'方法。

一些示例代碼

ClassA <- R6Class("ClassA", 
        public=list(
         getx = function() { 
          return(as.character(private$p_getx())) 
         } 
        ), 
        private=list(
         p_getx = function() { 
          return("ClassA") 
         } 

        ) 
       ) 


ClassB <- R6Class("ClassB", inherit = ClassA, 
        private=list(
         p_getx = function() { 
          return(factor("ClassB")) 
         } 

        ) 
       ) 



obj_A <- ClassA$new() 

obj_B <- ClassB$new() 

與輸出

> obj_A$getx() 
[1] "ClassA" 
> class(obj_A$getx()) 
[1] "character" 
> obj_B$getx() 
[1] "ClassB" 
> class(obj_B$getx()) 
[1] "character" 
+0

想到的解決辦法是這樣的事情,然而,不幸的是,用戶仍然可以覆蓋公共職能。如果R6有一些「鉤子」,這樣可以很好,這樣每次調用公共函數時都可以調用「檢查器」函數。不確定如何實現這一點,或者即使有可能。 –

+0

@NicholasHamilton我不太明白你爲什麼需要這些「檢查」功能。你的類的功能只能由其他人實現派生類的類來改變。在那裏它與R中的其他一切一樣 - 假定我們是成年人,人們可以按照他們認爲合適的方式推翻和改變事物。你可以做的是提供一個「檢查器」功能,有人可以向班級申請,看看它是否符合你的規格。但我不太明白你爲什麼需要這個級別的鎖定。在這種情況下,R可能只是你的錯誤語言。 –

+0

謝謝感謝您的評論,我爲我正在開發的一個項目提供了一個深度複雜的繼承樹,最終涉及許多動態文檔,這些動態文檔取決於每個R6對象內的函數輸出(其內容幾乎每次是不同的,但需要返回相同的結構)以便無誤地執行。沒關係,我可以通過返回一個R6或Structure對象來解決這個問題,該對象具有一個強制提供所需元素的構造方法。 –