Dziedziczenie

Klasom S3 brakuje struktury, którą zwykle można znaleźć w innych językach. Dziedziczenie jest realizowane nieformalnie, a enkapsulacja nie jest wymuszana przez język, jak widzieliśmy wcześniej. Aby zaimplementować dziedziczenie, utworzymy funkcję square_constructor, która otrzyma długość boków w a i nazwę koloru. Następnie użyjemy rectangle_constructor() i wyślemy a dla obu długości (tworząc kwadrat), a także wyśle ​​kolor. Następnie dodamy klasę S3square, a na koniec zwrócimy utworzony obiekt:

square_onstructor <- function (a, color) {

square <- rectangle_constructor(a,a, color)

class(square) <- c(„S3square”, class(square))

return(square)

}

Teraz utworzymy kwadrat i wydrukujemy jego klasy. Jak widać, ma przypisane klasy S3square i S3Rectangle w kolejności, a kiedy użyjemy na nich metody print(), w rzeczywistości otrzymujemy funkcję wyświetlania z klasy S3Rectangle, której oczekuje się, ponieważ sygnalizujemy dziedziczenie:

S3_square <- square_constructor(4, „red”)

class(S3_square)

#> [1] “S3Square” “S3Rectangle”

print(S3_square)

#> [1] “czerwony prostokąt: 4 x 4 == 16”

Jeśli chcemy zapewnić określoną funkcjonalność drukowania dla kwadratu, musimy nadpisać metodę print() naszą własną definicją klas S3Square, tak jak to robimy teraz. Funkcja jest dokładnie taka sama jak poprzednio, ale używamy słowa „square” zamiast „rectnagle”.

print.S3square <- function(square) {

print(paste(

S3color(square) , „square:” ,

square$a, „x”, square$b, „==”, S3area(square)

))

}                                                

Teraz, kiedy wyświetlamy, widzimy, że używana jest właściwa metoda, ponieważ w wyniku widzimy słowo „square”. Zauważ, że nie musieliśmy ponownie rejestrować metody print() z funkcją UseMethod(), ponieważ już to zrobiliśmy:

print(S3_square)

#> [1] “czerwony kwadrat: 4 x 4 == 16”

Na koniec pamiętaj, że jeśli atrybut class jest wektorem z więcej niż jednym elementem, to pierwszy element jest interpretowany jako klasa obiektu, a kolejne elementy są interpretowane jako klasy, z których dziedziczy obiekt. To sprawia, że ​​dziedziczenie jest własnością obiektów, a nie klas, a porządek jest ważny. Gdybyśmy zamiast tego napisali clsss(square) <- c(class(square), „S3quare”)w funkcji square_constructor(), to nawet po utworzeniu funkcji print.S3square() będziemy nadal zobacz metodę print() wywołującą funkcję print.S3Rectangle. Uważaj z tym

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *