2014-01-15 52 views
4

我無法在help(ReferenceClasses)的虛擬/抽象類中找到太多 - 任何人都可以提供創建一個的基本示例嗎?而且,我怎樣才能指定一個虛擬方法並強制子類必須實現呢?如何在R中創建虛擬參考類?

回答

3

參考類是S4類。所以也許你應該看到的setClassClasses幫助:

這裏虛設例如:

# virtual Base Class 
setRefClass( 
    Class="virtC", 
    fields=list( 
    .elt="ANY" 
), 
    methods = list(
    .method = function(){ 
     print("Base virtual method is called") 
    } 
), 
    contains=c("VIRTUAL") 
) 

## child 1 
## field as char and .method is overwritten 
setRefClass( 
    Class="childNum", 
    fields=list( 
    .elt="numeric" 
), 
    contains=c("virtC") 
) 


## child 2 
## field is numeric and base .method is used 
setRefClass( 
    Class="childChar", 
    fields=list( 
    .elt="character" 
), 
    methods = list(
    .method = function(){print('child method is called')} 
), 
    contains=c("virtC") 
) 
## new('virtA')   ## thros an error can't isntantiate it 
a = new("childChar",.elt="a") 
b = new("childNum",.elt=1) 

b$.method() 
[1] "Base virtual method is called" 

a$.method() 
[1] "child method is called" 
+0

感謝,但同時virtC'被捕獲虛擬類'的顯式實例,似乎是沒有任何機制確保子類實際上實現了從父類繼承的所有抽象方法 - 我仍然能夠在未實現'$ .method'的情況下聲明類「childChar」。任何方式來糾正這種行爲? – mchen

+1

@MiloChen那是因爲R根本不知道抽象方法。如果你想強制'.method'被覆蓋,你可以在虛擬類中用'stop(「virtC $ .method()必須實現)來實現它。 – Beasterfield

+0

@MiloChen我只是補充說,類是**虛擬**而不是**抽象**。我編輯我的示例以顯示此功能。 – agstudy