Menu
CoddyTech

contains ile Genişletme

Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 32 / 57.

contains = "Animal" yeni bir S4 sınıfını Animal alt sınıfı yapar. Alt sınıf, üst sınıfının tüm slotlarına ek olarak kendi slotlarına da sahip olur ve new() hepsini alır:

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)

Çıktı:

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

Ebeveyn için yazılan yöntemler çocuk için de çalışır. Bir generic'in Dog için yöntemi yoksa S4, Animal için olanı kullanır:

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

Çıktı:

[1] "I am Rex"

Bir alt sınıf, aynı jenerik için kendi metodunu tanımlayarak üst sınıf metodunu geçersiz kılar. En özgül sınıf kazanır, diğer alt sınıflar ise üst sınıfın metodunu kullanmaya devam eder:

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

Çıktı:

woof ...

Bir köpek için is(x, "Animal") değeri TRUE olur ve "Animal" olarak tanımlanan bir yuva Dog kabul eder. Üst sınıf için yazılan kod, tüm alt sınıflarla çalışır:

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

Çıktı:

TRUE TRUE
challenge icon

Görev

Kolay

Çalışanlar ve yöneticiler iki dosyadaki S4 sınıflarıdır. Employee.R, Employee sınıfını (name, salary yuvaları) ve genel describe() işlevini tanımlar; ayrıca Bo earns 40000 döndüren bir Employee yöntemi gerekir. Manager.R içinde, Employee sınıfını içeren ve reports yuvasını (numeric) ekleyen Manager sınıfını tanımlayın ve describe() işlevini Ada earns 60000 and manages 4 döndürecek şekilde geçersiz kılın.

Sağlanan kod, employee Bo 40000 veya manager Ada 60000 4 satırlarını okur ve describe() sonucunu, nesnenin çalışan olup olmadığını ve yuvalarını yazdırır.

Kodunuzu Employee.R ve Manager.R dosyalarına yazın. main.R, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

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

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Tabanlı Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi