今回の記事については説明や用語・概念の説明についてちょっと自信がないです。
SASメインで、他のオブジェクト指向の言語をあんまりやったことがないので、もしもっと上手く説明できる方がいらっしゃれば是非どこかにアップして欲しいです。
さて、苦手ながらも大事な部分なので頑張って書いてみます。
一般的なオブジェクト指向言語でのクラスという概念が、DS2ではパッケージになると思います。
SASメインで、他のオブジェクト指向の言語をあんまりやったことがないので、もしもっと上手く説明できる方がいらっしゃれば是非どこかにアップして欲しいです。
さて、苦手ながらも大事な部分なので頑張って書いてみます。
一般的なオブジェクト指向言語でのクラスという概念が、DS2ではパッケージになると思います。
DS2のパッケージには、いわゆる「インヘリタンス(継承)」という機能がありません。
継承は、既存クラスの全機能を引き継いで新たなクラスを定義することで、オブジェクト指向の3大要素とかって言われるぐらい重要なものです。親のメソッドを全部引き継いだ子を作るイメージです
それがないってどうなの?ってことですが、代わりにすべて、同じくオブジェクト指向の「コンポジション(集約)」という概念でまかないます。
インヘリタンスとコンポジションの違いは、ちょっと検索して貰えればたくさん説明がでてくるので、そちらを参考にしてください。
僕がわかりやすかったのは以下のとか?
要するに、単純に他のパッケージの必要なメソッドだけもってきて新規パッケージの中で使えるようにしちゃうってイメージで僕は理解しました。
例えば以下のような、数値に1を加えるメソッド(tasu1メソッド)と2倍するメソッド(kake2)をもったパッケージ(p1パッケージ)があるとします
proc ds2 libs=work;
package p1 /overwrite=yes;
declare double v;
method tasu1(double v) returns double;
return v+1;
end;
method kake2(double v) returns double;
return v*2;
end;
method kake2(double v) returns double;
return v*2;
end;
endpackage;
run;
quit;
次に新しく作成するパッケージ(p2パッケージ)の中で、p1のtasu1メソッドの機能を使いたい場合は以下のように書けます
proc ds2 libs=work;
package p2 /overwrite=yes;
declare package p1 pp1();
declare double v;
method p2();
pp1=_new_ p1();
end;
method tasu1(double v) returns double;
return pp1.tasu1(v);
end;
method tasu2(double v) returns double;
return v+2;
end;
endpackage;
run;
quit;
最初のdeclareでパッケージp1をpp1という名前で呼び出している(パッケージp1からインスタンスpp1を生成)のは、普通にパッケージを利用する場合と同様なので自然にかけると思います。
ただ、それだけだと不十分で、
method p2();
pp1=_new_ p1();
end;
の部分、パッケージ名と同じなのでコンストラクタになるわけですが、
ここで謎の式を書いてますが、これも実はパッケージの呼び出し方(インスタンスの生成)の書き方なんですね。p1パッケージからpp1インスタンスを生成するという意味になります。
の部分、パッケージ名と同じなのでコンストラクタになるわけですが、
ここで謎の式を書いてますが、これも実はパッケージの呼び出し方(インスタンスの生成)の書き方なんですね。p1パッケージからpp1インスタンスを生成するという意味になります。
declareステートメントと同じことしてんじゃんって感じで、なんでこんなのが必要なのかなんですが
呼び出しのコードをみるとわかりやすいかもです
proc ds2 libs=work;
data A1(overwrite=yes);
declare double x y;
declare package p2 p2();
method run();
x=p2.tasu1(1);
y=p2.tasu2(1);
end;
enddata;
run;
なんですが、ようするにp2パッケージしか呼び出してないのに、内部でp1パッケージの機能も呼び出されている、つまりp1のインスタンスも生成されているのがミソなんです。
パッケージが呼び出された際に、最初に実行されるコンストラクタの部分でp1のインスタンスを作らないと実際使えないよってことなんですね。パッケージを呼び出した際に内部のdecalreステートメントが実行されるわけではないので。
はぁ、自分の説明力のなさに嫌気がさします、、。
ほんとすみません、どなたか、もっとちゃんと説明しなおしてください