Menu
Coddy logo textTech

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 sınıfının alt sınıfı yapar. Alt sınıf, üst sınıfının tüm slot'larına ek olarak kendi slot'una da sahip olur ve new() bunların tümünü 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

Üst sınıf için yazılan yöntemler alt sınıf için de çalışır. Bir generic’in Dog için yöntemi olmadığında, 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ı generic için kendi metodunu tanımlayarak üst sınıf metodunu geçersiz kılar. En özgül sınıf kazanır ve diğer alt sınıflar üst sınıfın metodunu korur:

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 ...

is(x, "Animal") bir köpek için TRUE değerindedir ve "Animal" olarak tanımlanan bir slot, bir Dog kabul eder. Üst sınıf için yazılan kod, her alt sınıfla ç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 dosyada S4 sınıflarıdır. Employee.R, Employee sınıfını (name, salary yuvaları) ve genel describe() işlevini bildirir ve Bo earns 40000 döndüren Employee için bir yönteme ihtiyaç duyar. Manager.R içinde, Employee içeren ve reports yuvasını (numeric) ekleyen Manager sınıfını bildirin ve Ada earns 60000 and manages 4 döndürecek şekilde describe() işlevini geçersiz kılın.

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

Kodunuz Employee.R ve Manager.R dosyalarına gider. main.R, sağlanan giriş/çıkış 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