Ideą obiektu jest tak naprawdę połączenie danych i odpowiednich metod. Listy w języku R są dobrze przystosowane do implementacji tego, ponieważ mogą zawierać różne typy danych, nawet funkcje, które są obiektami pierwszej klasy, które można przypisać lub zwrócić jak każdy inny. Faktycznie, możemy dosłownie tworzyć obiekty nowej klasy w R, pobierając listę i po prostu ustawiając atrybut klasy listy na nową wartość, tak jak tworzymy klasy w S3. Zamiast podawać definicje klas S3, udostępniamy konstruktory. Te konstruktory są odpowiedzialne za tworzenie obiektów (ciąg znaków, który ma parametr przekazany w przypadku S3Color i listę w przypadku S3Rectangle) i przypisanie ciągu do ich atrybutów klasowych. Te obiekty są następnie zwracane i reprezentują klasy, których będziemy używać. W przypadku prostokąta nasz konstruktor otrzymuje długość, prostopadłe boki oraz nazwę jego koloru. Konstruktor koloru otrzymuje tylko nazwę koloru:
color_constructor <- function(color){
class(color) <- „S3Color”
return(color)
}
retangle_constructor <- function(a,b,color) {
rectangle <- list(a = a, b = b, color = color_constructor(color))
class(rectangle) <- „S3Rectangle”
return(rectangle)
}
Jak widać, zamiast przypisywać ciąg color, który jest przekazywany jako parametr do funkcji rectnagle_constructor() bezpośrednio w color elementu listy rectangle używamy funkcji color_constructor(), aby zapewnić klasę Color, a nie tylko ciąg znaków. Powinieneś to zrobić, jeśli dodasz zachowanie do abstrakcji kolorów, tak jak my. Teraz możemy utworzyć ,S3_rectangle wywołując rectnagle_constructor() i możemy wyświetlić tą klasę, którą jest S3Rectangle, tak jak oczekiwaliśmy. Ponadto, jeśli wyświetlisz strukturę S3_rectnagle, zobaczysz, że zawiera ona dwie strony definicji prostokąta, klasę koloru i nazwy klas atrybutów:
S3_rectangle <- rectnagle_constructor(2,3,”blue”)
class(S3_rectangle)
#> [1] “S3Rectangle”
str(S3_rectangle)
#> Lista 3
#> $ a: num 2
#> $ b: num 3
#> $ color: Class ‘S3Color’ chr “blue”
#> – attr (*, “class”) = chr “S3Rectangle”
Czasami zobaczysz, że dodaliśmy przedrostek do obiektu z nazwą modelu obiektów, którego używamy (w tym przypadku S3). Na przykład S3Color i S3Rectangle. Kiedy to widzisz, oznacza to, że dana nazwa koliduje z odpowiednim obiektem w innym modelu obiektowym i musimy je rozróżnić. Jeśli tego nie zrobisz, możesz napotkać dość zagmatwane i trudne do zdiagnozowania błędy.