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 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.Riçinde,Paymentiçinreceipt()metodunu: sınıf adının küçük harfle yazılmış hâli,amountvefee()kullanılarak oluşturulancard: 100.00 + 2.00 fee;Card.Riçinde,Cardsınıfını (Paymentiçerir) ve onunfee()metodunu: miktarın %2'si;Cash.Riçinde,Cashsınıfını ve onunfee()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 = "")
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
1S3 Temelleri
Dosyalarla ÇalışmaSınıf ile ListelerYapıcı FonksiyonlarPrint ve Format MetotlarıDoğrulayıcılar ve YardımcılarTekrar - Sıcaklıklar4R'da Kapsülleme
Nesne Olarak Closure'larNesne Olarak OrtamlarErişimci FonksiyonlarDurumu KorumaÖzet - Parkmetre7S4 Kalıtım
contains ile GenişletmecallNextMethodSanal Sınıflaris() ile Türleri Kontrol EtmeTekrar - Hayvanat Bahçesi Bakıcısı2S3 Generic'leri ve Metotları
Generic'ler ve UseMethodVarsayılan MetotlarTemel Generic'ler için MetotlarNextMethod TemelleriTekrar - Şekil Alanları5S4 Sınıfları
S4 Sınıflarını TanımlamaSlotlar ve ErişimGeçerlilik KontrolleriShow MetotlarıÖzet - Ürün Kataloğu8Referans Sınıfları
Referans Sınıflarını TanımlamaMetotlar ve Alan GüncellemeleriKopyalama SemantiğiKalıtım ve callSuperÖzet - Görev Kuyruğu11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Online R derleyicisi