2016-11-03 5 views
0

Допустим, у меня естьПреобразование из супер-класса унаследованного класса в R6

library(R6) 

Person <- R6Class("Person", 
       public = list(
       name = NULL, 
       hair = NULL, 
       initialize = function(name = NA, hair = NA) { 
        self$name <- name 
        self$hair <- hair 
        self$greet() 
       }, 
       set_hair = function(val) { 
        self$hair <- val 
       }, 
       greet = function() { 
        cat(paste0("Hello, my name is ", self$name, ".\n")) 
       } 
      ) 
) 

PersonWithSurname <- R6Class("PersonWithSurname", 
         inherit = Person, 
         public = list(surname = NA, 
             initialize = function(name, surname, hair) { 
             super$initialize(name, hair) 
             self$surname <- surname 
             }) 
) 

Тогда на R консоли я имею сказать,

newobject <- Person("Ann", "black") 
Hello, my name is Ann. 

Есть ли способ, где я могу теперь использовать вышеуказанный объект без повторного использования имени или переписывания кода в унаследованном объекте

eg Я не хочу, чтобы сделать

inheritObject <- PersonWithSurname$new("Ann", "Doe", "black") 
Hello, my name is Ann. 

Потому что я повторял «Энн» и «черный», в идеале я бы просто хочу

inheritObject <- PersonWithSurname$new("Doe") 
Hello, my name is Ann. 

И было бы сохранить все свойства.

Заранее спасибо.

ответ

1

Вы могли бы сделать что-то вроде:

PersonWithSurname <- R6Class("PersonWithSurname", 
         inherit = Person, 
         public = list(surname = NA, 
             initialize = function(name, surname, hair) { 
             if (inherits(name,"Person")) super$initialize(name$name, name$hair) else 
             super$initialize(name, hair) 
             self$surname <- surname 
             }) 
) 

Как вы можете видеть, я позволил в конструкторе, чтобы обеспечить Person объект, вместо character определения имени. Попытка его:

inheritObject<-PersonWithSurname$new(newobject,"Doe") 
#Hello, my name is Ann. 
+0

Я совсем как этот подход Altough на [второй] конструктору (https://stackoverflow.com/questions/35881234/user-constructor-for-r6-class-in-r) может быть более элегантный. –

 Смежные вопросы

  • Нет связанных вопросов^_^