Как управлять наследованием при динамическом расширении эталонных классов - PullRequest
4 голосов
/ 18 октября 2011

В настройках webcrawler / webscraper я бы хотел динамически расширить базовый базовый класс URL, чтобы иметь возможность писать конкретные методы для соответствующих хостов / доменов. Просто чтобы быть понятным, под динамически я подразумеваю что-то вроде « автоматически генерирует определения классов при обнаружении новых доменов (например, класс URL_something.com, который наследуется от класса URL)».

Работает угощение, единственная проблема в том, что мой класс WebPage ожидает, что значение поля url будет класса URL. Он будет принимать объекты класса URL_something.com, поскольку он наследуется от класса URL, но затем фактически превращает объект в экземпляр класса URL. Поэтому я теряю информацию, что это на самом деле класс URL_something.com.

Есть ли у вас какие-либо идеи о том, как я могу предотвратить потерю этой важной информации?

Пример кода

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"

1 Ответ

1 голос
/ 16 ноября 2011

Понимание того, что сказал Мартин (см. Комментарии выше): R 2.14.0 исправляет то, что я описал выше.

...