Menu
Coddy logo textTech

Sanal Sınıflar

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

Sanal sınıf, bir sınıf ailesinin ortak özelliklerini tanımlar ve kendisine ait nesnelere sahip olamaz. Bunu representation("VIRTUAL") ile tanımlayın; alt sınıfları her zamanki gibi contains kullanır:

setClass("Shape", representation("VIRTUAL"))
setClass("Circle", contains = "Shape", slots = c(r = "numeric"))
setClass("Square", contains = "Shape", slots = c(side = "numeric"))
cat(isVirtualClass("Shape"), is(new("Circle", r = 1), "Shape"), "\n")
cat(tryCatch({ new("Shape"); "made" }, error = function(e) "not allowed"), "\n")

Çıktı:

TRUE TRUE 
not allowed 

Sanal sınıf için bir yöntem, her alt sınıfta çalışır. Burada Shape için describe(), her alt sınıfın uyguladığı area() işlevini çağırır; böylece açıklama bir kez yazılır:

setClass("Shape", representation("VIRTUAL"))
setClass("Circle", contains = "Shape", slots = c(r = "numeric"))
setClass("Square", contains = "Shape", slots = c(side = "numeric"))
invisible(setGeneric("area", function(s) standardGeneric("area")))
invisible(setGeneric("describe", function(s) standardGeneric("describe")))
setMethod("area", "Circle", function(s) pi * s@r^2)
setMethod("area", "Square", function(s) s@side^2)
setMethod("describe", "Shape", function(s) sprintf("%s with area %.2f", class(s), area(s)))
for (s in list(new("Circle", r = 1), new("Square", side = 2))) cat(describe(s), "\n")

Çıktı:

Circle with area 3.14 
Square with area 4.00 

Bir sanal sınıf, her alt sınıfın sahip olacağı yuvaları bildirebilir:

setClass("Shape", representation("VIRTUAL", label = "character"))
setClass("Square", contains = "Shape", slots = c(side = "numeric"))
sq <- new("Square", label = "tile", side = 2)
print(slotNames("Square"))

Çıktı:

[1] "side"  "label"

setClassUnion() mevcut sınıflardan sanal bir sınıf oluşturur. Bu türdeki bir slot, örneğin e-posta adresi veya telefon numarası olan bir iletişim bilgisi gibi, bunlardan herhangi birini kabul eder:

setClassUnion("Contact", c("character", "numeric"))
setClass("Friend", slots = c(name = "character", contact = "Contact"))
a <- new("Friend", name = "Ada", contact = "ada@x.org")
b <- new("Friend", name = "Bo", contact = 5550123)
cat(class(a@contact), class(b@contact), "\n")
cat(tryCatch({ new("Friend", name = "Cy", contact = TRUE); "ok" }, error = function(e) "refused"), "\n")

Çıktı:

character numeric 
refused 
challenge icon

Görev

Kolay

Ödemeler, Payment sanal sınıfını (amount slotu) ve tamamı Payment.R içinde bulunan fee() ve receipt() generic'lerini paylaşır. Şunları tamamlayın:

  • Payment.R içinde, Payment için receipt() metodunu: sınıf adının küçük harfle yazılmış hâli, amount ve fee() kullanılarak oluşturulan card: 100.00 + 2.00 fee;
  • Card.R içinde, Card sınıfını (Payment içerir) ve onun fee() metodunu: miktarın %2'si;
  • Cash.R içinde, Cash sınıfını ve onun fee() metodunu: 0.

Sağlanan kod, card 100 veya cash 20 satırlarını okur, her makbuzu ve toplam ücreti yazdırır; ardından Payment'ın sanal olduğunu ve oluşturulamayacağını denetler.

Kodunuz Payment.R, Card.R ve Cash.R dosyalarına gider. main.R, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

source("Payment.R")
source("Card.R")
source("Cash.R")

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
total <- 0
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  amount <- as.numeric(p[2])
  pay <- switch(p[1], card = new("Card", amount = amount), cash = new("Cash", amount = amount))
  cat(receipt(pay), "\n", sep = "")
  total <- total + amount + fee(pay)
}
cat(sprintf("charged: %.2f", total), "\n", sep = "")
cat("Payment is virtual: ", isVirtualClass("Payment"), "\n", sep = "")
cat(tryCatch({ new("Payment", amount = 1); "created a Payment" }, error = function(e) "cannot create a Payment"), "\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