をプログラムとして見たときに注意・検討すべきところを学んでおきたい、ということで
を読んでいく。
前回
9. オブジェクト指向プログラミング
オブジェクト指向プログラミング()は分かりやすく再利用しやすいコードを書くのに役立つ。
- で扱うものはすべてオブジェクトである
- はカプセル化を促進する
- のクラスは多態的で、同じ関数呼び出しでもオブジェクトのクラスが異なると異なる演算になる
- は継承を認めている
9.1 S3クラス
初期のクラス構造であるクラスは依然としてにおいて主要なクラスパラダイムである。
クラスはリストで構成され、クラス名属性とディスパッチ構造が付いている。ディスパッチ機能により、ジェネリック関数が利用できるようになっている。
9.1.3 S3クラスの記述
クラスのクラスインスタンスはリストを形成して作成し、リスト成分はそのクラスのメンバ変数である。
#################### ### S3クラスの例 ### #################### # 例:従業員クラスの定義 j <- list(name = "Joe", salary = 55000, union = T) class(j) <- "employee" attributes(j) # 継承:上の従業員クラスのサブクラスを定義 k <- list(name = "Kate", salary = 68000, union = T, hrsthismonth = 2) class(k) <- c("hrlyemployee", "employee") k
9.2 S4クラス
上述の従業員クラスでは、
- 組合員状態()を入れ忘れる
- をスペルミスする
- 他のクラスのオブジェクトを誤って属性にする
といったミスが生じ得る。このようなにおいて生じ得る問題を避けるべくクラスは開発された。
操作 | S3 | S4 |
---|---|---|
クラスの定義 | コンストラクタコード内で暗黙的 | |
オブジェクト生成 | リストの作成、クラス属性の設定 | |
メンバ変数の参照 | ||
ジェネリックの生成 | の定義 | |
ジェネリックの宣言 |
#################### ### S4クラスの例 ### #################### # S4クラスの定義 setClass("employee", representation( name = "character", salary = "numeric", union = "logical" )) joe <- new(Class = "employee", name = "Joe",salary = 55000, union = T) # S4のスロットへのアクセス joe@name # ジェネリック関数show()を定義 setMethod(f = "show", signature = "employee",definition = function(object){ inorout <- ifelse(object@union, "is","is not") cat(object@name, "has a salary of",object@salary,"and",inorout,"in the union","\n") }) show(joe)