R S3对象中出现了一个有趣的情况,因为它们不继承类。
可以看出agnes.object
(agnes{cluster}
函数的结果)有2个不同的类。
library( cluster )
example( agnes )
class( agn1 )
[1] "agnes" "twins"
但与此同时,当你阅读agnes.object
documentation时,会有一段“继承”,并且有一句话:'班级" agnes"继承自"双胞胎"。'
你怎么看?它真的是继承还是繁殖类:)?
答案 0 :(得分:1)
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"
并说明dispatch中的继承(方法选择)。
> foo(agn1)
[1] "agnes"
> bar(agn1)
[1] "twins"
> baz(agn1)
[1] "agnes"
R中的S3类系统是基于实例的,没有正式的类定义。类继承由字符向量隐含。因此,类"agnes"
的对象没有父类,而类c("agnes", "twins")
定义父类"twins"
的线性类层次结构(即使在类"twins"
的任何地方都没有对象单独!)。因为没有正式的类定义,声明自己属于同一类的两个对象可能具有完全不同的结构,例如,
structure(list(), class="A")
structure(list(x=1, y=2, z=3), class="A")
可以合法声称属于&#34; A&#34;!