5

特定の参照クラス メソッドについて、それが継承されているかどうかを判断するにはどうすればよいですか? より一般的には、継承ツリーのどこまで上にいるのかを判断する方法は?

たとえば、私のセットアップが次の場合:

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()また、メソッドで使用できるように、子イベント ハンドラから親イベント ハンドラを呼び出せると便利です。

4

1 に答える 1