理工系研究者のための Mac OS X, Windows, Linux メモ
 
ホーム >> UNIX >> R >> クラスの継承と多態性
このエントリーをはてなブックマークに追加

Rにおけるクラス(R5クラス)の継承と多態性

作成日:2014.5.1
環境:R 3.0.3

〈→現在はR6クラスを推奨〉

継承

R5クラスを継承するにはcontains変数に基本クラスのクラス名を与えます。 基本クラスのコンストラクタを実行するには,派生クラスのコンストラクタ内にcallSuper()を書きます。

setRefClass("Super",
  fields=list(fld1="numeric", fld2="numeric"),
  methods=list(
    initialize=function(){ fld1 <<- 123; fld2 <<- 456},
    mtd1=function(){ print(fld1) },
    mtd2=function(){ print(fld2) }
    )
  )
  
setRefClass("Sub",
  contains="Super", # 基本クラスを指定
  fields=list(fld3="numeric"),
  methods=list(
    initialize=function(){
      callSuper()
      fld3 <<- 789
    },
    mtd3=function(){ print(fld3) }
    )
  )
# - - - - - - - - - - 
sub <- new("Sub")
sub$mtd1()
sub$mtd2()
sub$mtd3()
[1] 123
[1] 456
[1] 789

多態性

基本クラスを継承して派生クラスを作成するときに,基本クラスのメンバ関数をオーバーライドすれば多態性が実現できます。

Rの場合はもともと変数やオブジェクトが同じかどうかチェックされないので,同じメソッドさえ持っていれば基本クラスを継承しておかなくても問題ありません。 しかし,他の言語と同様に説明した方が分かりやすいので,ここではそのようにしています。

setRefClass("Super", # 基本クラス
  fields=list(fld="numeric"),
  methods=list(
    initialize=function(){ fld <<- 123}
    )
  )
  
setRefClass("SubA", contains="Super", # 派生クラス
  methods=list(
    getValue=function(){ print(fld) }
    )
  )

setRefClass("SubB", contains="Super", # 派生クラス
  methods=list(
    getValue=function(){ print(fld*2) }
    )
  )

test <- function(obj){
  obj$getValue()
}

suba <- new("SubA")
subb <- new("SubB")

test(suba)
test(subb)
[1] 123
[1] 246

関連するページ

参考サイト・参考文献