Как контролировать наследование при динамическом расширении эталонных классов

StackOverflow https://stackoverflow.com/questions/7812678

  •  26-10-2019
  •  | 
  •  

Вопрос

В WebCrawler/WebScraper-Setting я хотел бы динамически расширить свой базовый справочный класс 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"
Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top