Metot Arama Sırası
Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 13 / 57.
Her çağrıda R, sınıf vektörünü soldan sağa tarar ve bulduğu ilk yöntemi çalıştırır. Hiçbir sınıfta bir yöntem yoksa varsayılanı kullanır. Aynı hiyerarşideki farklı nesneler farklı düzeylerde durabilir:
move <- function(x) UseMethod("move")
move.animal <- function(x) "walks"
move.bird <- function(x) "flies"
move.default <- function(x) "stays"
penguin <- structure(list(), class = c("penguin", "bird", "animal"))
dog <- structure(list(), class = c("dog", "animal"))
rock <- structure(list(), class = "rock")
cat(move(penguin), move(dog), move(rock))Çıktı:
flies walks staysBir alt sınıf, kendi yöntemini tanımlayarak üst sınıf yöntemini geçersiz kılar. Geçersiz kılma yalnızca alt sınıfı ve onun altındaki her şeyi etkiler; üst sınıf ve diğer alt sınıfları üst sınıf yöntemini kullanmaya devam eder:
move <- function(x) UseMethod("move")
move.animal <- function(x) "walks"
move.bird <- function(x) "flies"
move.penguin <- function(x) "swims"
penguin <- structure(list(), class = c("penguin", "bird", "animal"))
sparrow <- structure(list(), class = c("bird", "animal"))
cat(move(penguin), move(sparrow))Çıktı:
swims fliesHer generic ayrı ayrı aranır. Bir nesne kendi sınıfından sound() ve bir üst sınıftan move() alabilir; ayrıca bir üst sınıf yöntemi, çocukta yeniden dağıtım yapan diğer generic'leri çağırabilir:
sound <- function(x) UseMethod("sound")
move <- function(x) UseMethod("move")
describe <- function(x) UseMethod("describe")
sound.animal <- function(x) "..."
sound.dog <- function(x) "woof"
move.animal <- function(x) "walks"
describe.animal <- function(x) paste(x$name, "says", sound(x), "and", move(x))
rex <- structure(list(name = "Rex"), class = c("dog", "animal"))
print(describe(rex))Çıktı:
[1] "Rex says woof and walks"Class niteliğine sahip bir nesne için gönderim yalnızca bu niteliğe ve ardından varsayılan yönteme bakar. Nesne içeride hâlâ bir listedir, ancak list için bir yöntem denenmez:
size <- function(x) UseMethod("size")
size.list <- function(x) "a list"
size.default <- function(x) "default"
bag <- structure(list(1, 2), class = "bag")
cat(size(list(1, 2)), "/", size(bag))Çıktı:
a list / defaultGörev
KolayKare, kenarları eşit olan bir dikdörtgendir. Rectangle.R içinde area.rectangle(), perimeter.rectangle() ve name.rectangle() yöntemlerini yazın; name.rectangle(), rectangle 2x3 döndürür. Square.R içinde, square sınıfıyla new_rectangle() çağrısı yapan new_square(side) işlevini tamamlayın ve yalnızca name() işlevini name.square() ile geçersiz kılın; bu işlev square 2 döndürür. Kareler, dikdörtgenin area() ve perimeter() işlevlerini kullanmalıdır.
Jenerikler ve new_rectangle() verilmiştir. Sağlanan kod, iki sayı içeren satırları (bir dikdörtgen) veya tek sayı içeren satırları (bir kare) okur ve square 2: area 4, perimeter 8 yazdırır.
Kodunuz Rectangle.R ve Square.R içine yazılmalıdır. main.R, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
source("Rectangle.R")
source("Square.R")
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
n <- as.numeric(strsplit(line, " ")[[1]])
s <- if (length(n) == 1) new_square(n[1]) else new_rectangle(n[1], n[2])
cat(name(s), ": area ", area(s), ", perimeter ", perimeter(s), "\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 - Parkmetre2S3 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ç Alma3S3 Kalıtımı
Sınıf VektörleriMetot Arama SırasıNextMethod ile Genişletmeinherits() ile DenetlemeÖzet - Personel BordrosuKendi başına pratik yap: Online R derleyicisi