2017-03-16 11 views
1

Je crée deux classes S4, où la classe Employee hérite de l'autre classe Person.Comment rendre une classe S4 héritée correctement d'une autre classe S4?

La définition pour les deux classes est la suivante:

setClass("Person", slots = list(name="character", age="numeric")) 

setClass("Employee", slots = list(boss="Person")) 

Je crée une fois par exemple chacun de ces deux classes,

alice <- new("Person", name="Alice", age = 40) 

Cela fonctionne bien, mais lorsque je tente de créer un par exemple à l'aide de l'employé:

john <- new("Employee", name = "John", age = 20, boss= alice) 

Il donne l'erreur comme ci-dessous:

Error in initialize(value, ...) : 
    invalid names for slots of class “Employee”: name, age 

Est-ce que je ne peux pas créer l'objet de cette façon?

+3

Vous avez oublié de spécifier la classe de base pour 'Employee'; utilisez 'setClass (" Employé ", slots = liste (boss =" Personne "), contient =" Personne ")' et cela devrait fonctionner. – nrussell

+0

@ Mise à jour de la question, toujours la même erreur – Sarang

+2

@Sarang 'contains' est un paramètre de' setClass' et doit être en dehors de la liste. Étudiez soigneusement les parenthèses dans le commentaire de Russell. – Roland

Répondre

2

par le commentaire de nrussel:

l'argument contains de la fonction setClass traite l'héritage. Vous voulez que la classe Employee hérite de la classe Person (c'est-à-dire qu'un employé est un type particulier de personne). Donc

setClass("Person", slots = list(name="character", age="numeric")) 
setClass("Employee", slots = list(boss="Person"), contains = "Person") 

fera l'affaire.

> alice <- new("Person", name="Alice", age = 40) 
> john <- new("Employee", name = "John", age = 20, boss= alice) 
> john 
An object of class "Employee" 
Slot "boss": 
An object of class "Person" 
Slot "name": 
[1] "Alice" 

Slot "age": 
[1] 40 


Slot "name": 
[1] "John" 

Slot "age": 
[1] 20