Multiple inheritance for R6 classes

前端 未结 2 1712
陌清茗
陌清茗 2021-02-03 10:08

Actual question

What are my options to workaround the fact that R6 does not support multiple inheritance?

Disclaimer

I know that R is primarily a fun

2条回答
  •  夕颜
    夕颜 (楼主)
    2021-02-03 10:46

    For those interested:

    I gave it a second thought and realized that's it's not really multiple inheritance per se that I want/need, but rather some sort of better mimicking the use of interfaces/abstract classes without giving up inherit for that.

    So I tried tweaking R6 a bit so it would allow me to distinguish between inherit and implement in a call to R6Class.

    Probably tons of reasons why this is a bad idea, but for now, it gets the job done ;-)

    You can install the tweaked version from my forked branch.

    Example

    devtools::install_github("rappster/R6", ref = "feat_interface")
    library(R6)
    

    Correct implementation of interface and "standard inheritance":

    IFoo <- R6Class("IFoo",
      public = list(foo = function() stop("I'm the inferace method"))
    )
    BaseClass <- R6Class("BaseClass",
      public = list(foo = function(n = 1) private$x[1:n])
    )
    Foo <- R6Class("Foo", implement = IFoo, inherit = BaseClass,
      private = list(x = letters)
    )
    
    > Foo$new()
    
      Implements interface: 
      Inherits from: 
      Public:
        clone: function (deep = FALSE) 
        foo: function (n = 1) 
      Private:
        x: a b c d e f g h i j k l m n o p q r s t u v w x y z
    

    When an interface is not implemented correctly (i.e. method not implemented):

     Bar <- R6Class("Bar", implement = IFoo,
        private = list(x = letters)
      )
    > Bar$new()
    Error in Bar$new() : 
    
    Non-implemented interface method: foo
    

    Proof of concept for dependency injection

    This is a little draft that elaborates a bit on the motivation and possible implementation approaches for interfaces and inversion of dependency in R6.

提交回复
热议问题