2016-03-10 3 views
4

Допустим, у меня есть класс R6 Person:Изменить инициализацию метод в подклассе класса R6

library(R6) 

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

Если я хочу создать подкласс, чей initialize метод должен быть одинаковым для добавления еще одной переменной self кроме как бы я это сделал?
Я попытался следующие:

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

Однако, когда я создаю новый экземпляр класса PersonWithSurname Поля name и hair являются NA, то есть значение по умолчанию класса Person.

PersonWithSurname$new("John", "Doe", "brown") 
Hello, my name is John. 
<PersonWithSurname> 
    Inherits from: <Person> 
    Public: 
    clone: function (deep = FALSE) 
    greet: function() 
    hair: NA 
    initialize: function (name, surname, hair) 
    name: NA 
    surname: Doe 

В Python я хотел бы сделать следующее:

class Person(object): 
    def __init__(self, name, hair): 
    self.name = name 
    self.hair = hair 
    self.greet() 

    def greet(self): 
    print "Hello, my name is " + self.name 

class PersonWithSurname(Person): 
    def __init__(self, name, surname, hair): 
    Person.__init__(self, name, hair) 
    self.surname = surname 
+0

На самом деле в Python можно использовать '', а не имя супер() родительского класса. Это предотвращает ошибки. –

ответ

8

R6 работает очень похож на Python в этом отношении; то есть, вы просто позвоните initialize на super объекта:

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

Насколько это документировано? Я ничего не мог найти о «супер» в виньетках. – Tommy

+0

@Tommy Действительно, документация немного отсутствует в этом отношении, но [Виньетка для введения] (https://cran.r-project.org/web/packages/R6/vignettes/Introduction.html) упоминает 'super' по крайней мере, хотя конкретно не объясняет инициализацию суперкласса. Поведение можно угадать из (нетривиальной) реализации R6. Кроме того, проекты содержат [тестовые примеры] (https://github.com/wch/R6/blob/f6cb021a5da2581aebda1d49afd872cd80967479/tests/testthat/test-nonportable-inheritance.R#L35), которые показывают это поведение. –

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