Menu
CoddyTech

Memperluas dengan contains

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 32 dari 57.

contains = "Animal" menjadikan class S4 baru sebagai subclass dari Animal. Subclass memiliki semua slot dari parent-nya, ditambah slotnya sendiri, dan new() menerima semuanya:

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)

Output:

[1] "breed" "name"  "age"  
Rex collie

Method yang ditulis untuk induknya juga berfungsi untuk anaknya. Jika generic tidak memiliki method untuk Dog, S4 menggunakan method untuk 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")))

Output:

[1] "I am Rex"

Class turunan mengganti method class induk dengan mendefinisikan method sendiri untuk generic yang sama. Class yang paling spesifik akan dipilih, sementara subclass lainnya tetap menggunakan method milik class induk:

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")))

Output:

woof ...

is(x, "Animal") bernilai TRUE untuk anjing, dan slot yang dideklarasikan sebagai "Animal" menerima Dog. Kode yang ditulis untuk class induk berfungsi dengan setiap subclass:

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"))

Output:

TRUE TRUE
challenge icon

Tantangan

Mudah

Karyawan dan manajer adalah class S4 dalam dua file. Employee.R mendeklarasikan Employee (slot name, salary) dan generic describe(), serta memerlukan method untuk Employee yang mengembalikan Bo earns 40000. Dalam Manager.R, deklarasikan Manager, yang berisi Employee dan menambahkan slot reports (numeric), lalu override describe() agar mengembalikan Ada earns 60000 and manages 4.

Kode yang disediakan membaca baris employee Bo 40000 atau manager Ada 60000 4, lalu mencetak describe(), apakah object tersebut adalah karyawan, dan slot-slotnya.

Tulis kodemu di Employee.R dan Manager.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

source("Employee.R")
source("Manager.R")

# Kode input/output yang disediakan: biarkan apa adanya
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 = "")
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler R online