R参考类-如何确定您是否在继承的方法中?

麦琴

对于给定的引用类方法,如何确定它是否被继承?更笼统地说,如何确定继承树有多远?

例如,如果我的设置是:

A <- setRefClass("A",
        methods = list(foo = function() whosMethod())
    )
B <- setRefClass("B",
        contains = "A",
        methods = list(bar = function() whosMethod())
    )
b <- B()

理想情况下,我想whosMethod()给我类似的东西

> b$foo()
[1] "A"         # or maybe a numeric value like: [1] 1L

> b$bar()
[1] "B"         # or maybe a numeric value like: [1] 0L

请注意,这与明显不同class(.self)"B"在上面的示例中总是会返回

动机-自定义事件

除了方法(例如自定义事件)之外,我还希望其他方法具有类似继承的行为。我的方法可以raise(someEvent)并且在实例化期间,我通过事件处理程序来处理这些事件,例如

MyDatabase <- setRefClass(....)
datasourceA <- MyDatabase(....,
    eventHandlers = list(
        someEvent = function() message("Hello from myObj!"),
        beforeInsert = function(data) {
            if (!dataIsValid(data))
                stop("Data is not valid!")
        }
    )
)

现在,如果子类定义了一个已经由父类定义的事件处理程序,那么我需要知道哪个事件处理程序应该被覆盖。特别是,如果一个methodA()登记handlerA()someEventmethodB()子类中注册handlerB()相同的事件,当试图注册handlerA()methodA()我需要知道的是,我在一个父类的方法,这样,如果handlerB()已经注册,我不重写。

能够从子方法调用父事件处理程序(如callSuper()方法可用的方法)也很好

拉珀斯特

尝试这个:

遍历继承图并获取相应的方法

methodsPerClass <- function(x) {
    if (!inherits(x, "envRefClass")) {
        stop("This only works for Reference Class objects")
    }
    ## Get all superclasses of class of 'x' //
    supercl <- selectSuperClasses(getClass(class(b)), directOnly=FALSE)
    ## Get all methods per superclass //
    out <- lapply(c(class(x), supercl), function(ii) {
        ## Get generator object //
        generator <- NULL
        if (inherits(getClass(ii), "refClassRepresentation")) {
            generator <- getRefClass(ii)
        }
        ## Look up method names in class defs //
        out <- NULL
        if (!is.null(generator)) {
            out <- names(Filter(function(x) {
                    attr(x, "refClassName") == generator$className
                }, 
                as.list(generator$def@refMethods))
            )        
        }
        return(out)
    })
    names(out) <- supercl
    ## Filter out the non-reference-classes //
    idx <- which(sapply(out, is.null))
    if (length(idx)) {
        out <- out[-idx]
    }
    ## Nicer name for actual class of 'x' //
    idx <- which(names(out) == "envRefClass") 
    if (length(idx)) {
        names(out)[idx] <- class(x)
    }
    return(out)
}

我敢肯定,为了消除最后的“ idx”部分,可以提出一种更好的方法来过滤掉非引用类,但是它可以工作。

这将为您提供:

methodsPerClass(x=b)
$A
[1] "bar"

$B
[1] "foo"

$.environment
 [1] "import"       "usingMethods" "show"         "getClass"     "untrace"     
 [6] "export"       "callSuper"    "copy"         "initFields"   "getRefClass" 
[11] "trace"        "field"     

查询哪些方法特别属于哪个类

whosMethod <- function(x, method) {
    mthds <- methodsPerClass(x=x)
    out <- lapply(method, function(m) {
        pattern <- paste0("^", m, "$")
        idx <- which(sapply(mthds, function(ii) {
            any(grepl(pattern, ii))
        }))
        if (!length(idx)) {
            stop(paste0("Invalid method '", m, 
                "' (not a method of class '", class(x), "')"))
        }
        out <- names(idx)
    })
    names(out) <- method
    return(out)
}

这将为您提供:

whosMethod(x=b, method="foo")
$foo
[1] "B"

whosMethod(x=b, method=c("foo", "bar"))
$foo
[1] "B"

$bar
[1] "A"

whosMethod(x=b, method=c("foo", "bar", "nonexisting"))
Error in FUN(c("foo", "bar", "nonexisting")[[3L]], ...) : 
  Invalid method 'nonexisting' (not a method of class 'B')

对类“ B”的所有方法运行它:

whosMethod(x=b, method=unlist(methodsPerClass(x=b)))
$bar
[1] "A"

$foo
[1] "B"

$import
[1] ".environment"

$usingMethods
[1] ".environment"

$show
[1] ".environment"

$getClass
[1] ".environment"

$untrace
[1] ".environment"

$export
[1] ".environment"

$callSuper
[1] ".environment"

$copy
[1] ".environment"

$initFields
[1] ".environment"

$getRefClass
[1] ".environment"

$trace
[1] ".environment"

$field
[1] ".environment"

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

R参考类中是否有析构函数?

来自分类Dev

R参考类:具有活动绑定的复制方法

来自分类Dev

R参考类和多个文件中方法的顺序

来自分类Dev

自动更新R参考类中的字段(数据成员)

来自分类Dev

如何确定Give属性是否不是从基类继承的?

来自分类Dev

确定是否从继承的类中调用了super()

来自分类Dev

在R参考类中,如何将字段定义为“ xts”对象

来自分类Dev

如何获得参考类的名称?

来自分类Dev

Swift类中的参考参数

来自分类Dev

如何确定是否存在类方法

来自分类Dev

在C ++中,如何确定某个类是否是继承链中的最后一个类/子级?即在基类的另一端

来自分类Dev

通用类的Java 8模糊方法参考

来自分类Dev

Tkinter参考方法和类之间的变量

来自分类Dev

Include扩展方法的类库参考

来自分类Dev

Tkinter参考方法和类之间的变量

来自分类Dev

Include扩展方法的类库参考

来自分类Dev

您是否缺少可靠的参考

来自分类Dev

如何加载类而不参考它?

来自分类Dev

XAML中的参考共享类用于绑定

来自分类Dev

systemverilog中的跨类/文件参考编译

来自分类Dev

不是 Perl 类中的代码参考

来自分类Dev

R参考类的Save字段

来自分类Dev

在Scala中如何确定类对象是否实现特征

来自分类Dev

R Reference Class多重继承:如何在特定的父类中调用方法?

来自分类Dev

如何在View类中获取Activity参考?

来自分类Dev

类的参考?它如何在记忆中锻炼?

来自分类Dev

类的参考?它如何在记忆中锻炼?

来自分类Dev

您是否需要在主类中扩展JApplet?

来自分类Dev

如何重载继承类中的方法以便基类看到继承的版本?

Related 相关文章

热门标签

归档