Преобразование из суперкласса в унаследованный класс в 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.

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

например я не хочу делать

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.
Другие вопросы по тегам