0

可以说我有

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.

它将保留所有属性。

提前致谢。

4

1 回答 1

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.
于 2016-11-03T11:03:27.310 回答