Menu
Coddy logo textTech

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 stays

Bir 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 flies

Her 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 / default
challenge icon

Görev

Kolay

Kare, 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 = "")
}
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