每个 S4 都需要通用吗

does every S4 needs to be generic

假设我们有以下虚拟对象 class

Foo <- setClass(Class = "Foo",slots = c(foo = "numeric"), 
    prototype = list(foo = numeric())

我想,泛型是用来重载不同的函数的。所以假设我们要实现一个访问器:

setMethod(f = "getFoo", signature = "Foo", 
    definition = function(Foo)
    {
        return(Foo@foo)
    }
)

这有效吗?或者我必须先定义一个泛型:

setGeneric(name="getFoo",
    def=function(Foo)
    {
        standardGeneric("getFoo")
    }
)

如果此函数类型只有一个特定 "instance",则没有理由定义泛型,对吗?

为了定义一个 S4 方法,必须有一个现有的 S4 泛型(来自 base、从另一个包导入,或者您自己定义)。我对这种设计的理解是提供在未来添加额外方法的灵活性,即使你甚至无法想象另一台 ATM。

也就是说,如果您只是想更简洁,您可以直接将默认函数提供给泛型函数。

setClass(Class = "Foo",slots = c(foo = "numeric"), 
                prototype = list(foo = numeric()))

setGeneric(name="getFoo",
           def=function(Foo)
           {
               standardGeneric("getFoo")
           }, useAsDefault=function(Foo){return(Foo@foo)}
)

# test the function
testFoo <- new("Foo", foo=3)

getFoo(testFoo)
[1] 3

所以,现在您拥有了通用的功能,其中包括您真正想要的唯一功能。您还可以选择在将来根据应用程序的开发方式添加泛型。