Расширение с помощью contains
Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 32 из 57.
contains = "Animal" делает новый класс S4 подклассом Animal. Подкласс содержит все слоты родительского класса, а также свои собственные, и new() принимает их все:
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)Вывод:
[1] "breed" "name" "age"
Rex collieМетоды, написанные для родительского класса, работают и для дочернего класса. Когда для обобщённого метода нет метода для Dog, S4 использует метод для 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")))Вывод:
[1] "I am Rex"Дочерний класс переопределяет метод родительского класса, определяя собственный метод для того же обобщённого метода. Побеждает наиболее специфичный класс, а остальные подклассы сохраняют метод родительского класса:
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")))Вывод:
woof ...is(x, "Animal") имеет значение TRUE для собаки, а слот, объявленный как "Animal", принимает объект Dog. Код, написанный для родительского класса, работает с каждым подклассом:
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"))Вывод:
TRUE TRUEЗадание
ЛегкоСотрудники и менеджеры являются классами S4 в двух файлах. Employee.R объявляет Employee (слоты name, salary) и обобщённую функцию describe(), а также требует метод для Employee, который возвращает Bo earns 40000. В Manager.R объявите Manager, который содержит Employee и добавляет слот reports (numeric), а также переопределите describe(), чтобы он возвращал Ada earns 60000 and manages 4.
Предоставленный код считывает строки employee Bo 40000 или manager Ada 60000 4 и выводит describe(), информацию о том, является ли объект сотрудником, а также его слоты.
Ваш код должен находиться в Employee.R и Manager.R. В main.R содержится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
source("Employee.R")
source("Manager.R")
# Предоставленный код ввода/вывода: оставьте его как есть
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 = "")
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы S3
Работа с файламиСписки с классомФункции-конструкторыМетоды print и formatВалидаторы и вспомогательные функцииПовторение — температуры4Инкапсуляция в R
Замыкания как объектыОкружения как объектыФункции доступаЗащита состоянияПовторение — парковочный счётчик7S4 Наследование
Расширение с помощью containscallNextMethodВиртуальные классыПроверка типов с помощью is()Повторение — смотритель зоопарка10Шаблоны проектирования, часть 2
Шаблон «Декоратор»Шаблон «Строитель»Шаблон «Состояние»Шаблон «Итератор»2Обобщённые функции и методы S3
Обобщённые функции и UseMethodМетоды по умолчаниюМетоды для базовых обобщённых функцийОсновы NextMethodПовторение — площади фигур5Классы S4
Определение классов S4Слоты и доступПроверка корректностиМетоды showПовторение — каталог товаров8Ссылочные классы
Определение ссылочных классовМетоды и обновление полейСемантика копированияНаследование и callSuperПовторение — очередь задач11Проект: Управление библиотекой
Книги и читателиВыдача книг3Наследование S3
Векторы классовПорядок поиска методовРасширение с помощью NextMethodПроверка с помощью inherits()Повторение — расчёт зарплаты сотрудниковПотренируйтесь самостоятельно: Онлайн-компилятор R