Cómo controlar la herencia al extender dinámicamente las clases de referencia
-
26-10-2019 - |
Pregunta
En un WebCrawler/Webscraper-setting, me gustaría extender dinámicamente mi clase de referencia base URL
Para poder escribir métodos específicos para hosts/dominios respectivos. Solo para ser claro, por dinamicamente Me refiero a algo como "Genere automáticamente las definiciones de clase a medida que se encuentran los nuevos dominios (EG Clase URL_something.com
que heredaría de clase URL
)".
Funciona un regalo, el único problema es que mi clase WebPage
espera el valor del campo url
ser de clase URL
. Aceptará objetos de clase URL_something.com
Como esto hereda de clase URL
, pero luego convierte el objeto en una instancia de clase URL
. Así que pierdo la información de que en realidad es de clase URL_something.com
.
¿Tiene alguna idea de cómo puedo evitar perder esa información crucial?
Ejemplo de código
setRefClass(Class="URL", fields=list(x="character"))
setRefClass(Class="WebPage", fields=list(url="URL"))
obj <- new("WebPage", url=new("URL", x="http://www.something.com/home/index.html"))
obj$url
# Method would recognize that there is no class 'URL_something.com'
# yet and thus create it:
setRefClass(Class="URL_something.com", contains="URL")
# Another method would take care of mapping field values to
# an instance of the new class:
> url.obj <- new("URL_something.com", x="http://www.something.com/home/index.html")
> inherits(url.obj, "URL")
[1] TRUE
> obj$url <- url.obj
> class(obj$url)
[1] "URL"
# So I lose the information that it was actually of class "URL_something.com"
Solución
Recogiendo lo que dijo Martin (ver los comentarios anteriores): R 2.14.0 arregla lo que describí anteriormente.