Extension avec contains
Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 32 sur 57.
contains = "Animal" fait d’une nouvelle classe S4 une sous-classe de Animal. La sous-classe possède tous les slots de sa classe parente, ainsi que les siens, et new() les prend tous :
setClass("Animal", slots = c(name = "character", age = "numeric"))
setClass("Dog", contains = "Animal", slots = c(breed = "character"))
rex <- new("Dog", name = "Rex", age = 3, breed = "collie")
print(slotNames("Dog"))
cat(rex@name, rex@breed)Résultat :
[1] "breed" "name" "age"
Rex collieLes méthodes écrites pour la classe parent fonctionnent aussi pour la classe enfant. Lorsqu’un générique n’a pas de méthode pour Dog, S4 utilise celle de Animal :
setClass("Animal", slots = c(name = "character"))
setClass("Dog", contains = "Animal")
invisible(setGeneric("intro", function(a) standardGeneric("intro")))
setMethod("intro", "Animal", function(a) paste("I am", a@name))
print(intro(new("Dog", name = "Rex")))Résultat :
[1] "I am Rex"Un enfant redéfinit une méthode parentale en définissant la sienne pour le même générique. La classe la plus spécifique l’emporte, et les autres sous-classes conservent la méthode de la classe parente :
setClass("Animal", slots = c(name = "character"))
setClass("Dog", contains = "Animal")
setClass("Cat", contains = "Animal")
invisible(setGeneric("sound", function(a) standardGeneric("sound")))
setMethod("sound", "Animal", function(a) "...")
setMethod("sound", "Dog", function(a) "woof")
cat(sound(new("Dog", name = "Rex")), sound(new("Cat", name = "Tom")))Résultat :
woof ...is(x, "Animal") est TRUE pour un chien, et un emplacement déclaré comme "Animal" accepte un Dog. Le code écrit pour la classe parente fonctionne avec toutes les sous-classes :
setClass("Animal", slots = c(name = "character"))
setClass("Dog", contains = "Animal")
setClass("Owner", slots = c(pet = "Animal"))
rex <- new("Dog", name = "Rex")
o <- new("Owner", pet = rex)
cat(is(rex, "Animal"), is(o@pet, "Dog"))Résultat :
TRUE TRUEDéfi
FacileLes employés et les responsables sont des classes S4 réparties dans deux fichiers. Employee.R déclare Employee (emplacements name, salary) et le générique describe(), et nécessite une méthode pour Employee qui renvoie Bo earns 40000. Dans Manager.R, déclarez Manager, qui contient Employee et ajoute l’emplacement reports (numérique), puis redéfinissez describe() pour qu’il renvoie Ada earns 60000 and manages 4.
Le code fourni lit des lignes employee Bo 40000 ou manager Ada 60000 4 et affiche describe(), indique si l’objet est un employé et affiche ses emplacements.
Votre code doit être placé dans Employee.R et Manager.R. main.R contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
source("Employee.R")
source("Manager.R")
# Code d'entrée/sortie fourni : conservez-le tel quel
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
x <- if (p[1] == "manager") {
new("Manager", name = p[2], salary = as.numeric(p[3]), reports = as.numeric(p[4]))
} else {
new("Employee", name = p[2], salary = as.numeric(p[3]))
}
cat(describe(x), "\n", sep = "")
cat("is an employee: ", is(x, "Employee"), ", slots: ", paste(slotNames(x), collapse = ", "), "\n", sep = "")
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Bases de S3
Travailler avec les fichiersListes avec une classeFonctions constructricesMéthodes print et formatValidateurs et fonctions utilitairesRécapitulatif - Températures4Encapsulation dans R
Les fermetures comme objetsLes environnements comme objetsFonctions d’accèsProtéger l’étatRécapitulatif - Parcmètre7S4 Héritage
Extension avec containscallNextMethodClasses virtuellesVérifier les types avec is()Récapitulatif - Gardien de zoo2S3 : génériques et méthodes
Génériques et UseMethodMéthodes par défautMéthodes pour les génériques de baseNotions de base sur NextMethodRécapitulatif - Aires des formes5Classes S4
Définir des classes S4Slots et accèsVérifications de validitéMéthodes showRécapitulatif - Catalogue de produits8Classes de référence
Définition des classes de référenceMéthodes et mises à jour des champsSémantique de copieHéritage et callSuperRécapitulatif - File d’attente des tâches11Projet : gestion de bibliothèque
Livres et membresEmprunter des livres3Héritage S3
Vecteurs de classesOrdre de recherche des méthodesÉtendre avec NextMethodVérifier avec inherits()Récapitulatif - Paie du personnelEntraînez-vous par vous-même : Compilateur R en ligne