S3 допускает линейную иерархию классов. Так
> class(agn1)
[1] "agnes" "twins"
говорит, что agn1 является экземпляром класса agnes, который расширяет (наследует) близнецов. Здесь мы определяем общие методы и методы
## S3 generics
foo <- function(x) UseMethod("foo")
bar <- function(x) UseMethod("bar")
baz <- function(x) UseMethod("baz")
## S3 methods -- append '.' and class name
foo.twins = function(x) "twins"
foo.agnes = function(x) "agnes"
bar.twins = function(x) "twins"
baz.agnes = function(x) "agnes"
и иллюстрируем наследование при отправке (выбор метода).
> foo(agn1)
[1] "agnes"
> bar(agn1)
[1] "twins"
> baz(agn1)
[1] "agnes"
Система класса S3 в R основана на экземпляре, формального определения класса нет. Наследование класса подразумевается символьным вектором. Таким образом, объект с классом "agnes"
не имеет родительского класса, тогда как класс c("agnes", "twins")
определяет иерархию линейных классов с родителем "twins"
(даже если объект отсутствует в любом месте с классом "twins"
). Потому что нет никакого формального определения класса, два объекта, объявляющих себя одного и того же класса может иметь совершенно другую структуру, например,
structure(list(), class="A")
structure(list(x=1, y=2, z=3), class="A")
оба может законно претендовать на класс «А»!
Но если функция перегружена только для класса близнецов, и есть какой-то объект с одним классом «agnes», то эта функция не будет работать на этом объекте. Таким образом, похоже, что «agnes» действительно не наследуется после близнецов. Мой вопрос только показал, что если есть объект с 2 классами, то функция принимает один или другой класс в линейном порядке. –
Наследование подразумевается символьным вектором; если вектор имеет длину один, а одно значение - «agnes», то это говорит о том, что этот экземпляр не имеет отношения наследования. S3 основан на экземпляре - наследование подразумевается вектором класса, а не некоторым определением класса. –
Так значит ли это ошибка в agnes.object manual :)? Должно быть написано, что agnes.object имеет 2 классности :)? –