トップページ⇒tech
415コメント136KB

【OO?】オブジェクトオリエンテッド総合【非OO?】

■ このスレッドは過去ログ倉庫に格納されています
0001Java曹長NGNG
このスレは、なんかム板でにわかに(一部で?)険悪なムードになりつつある、
「OO派」と「非OO派」のコロシアムのようなスレです。
初心者も基本的には歓迎ですが、用語くらいはまず自分で調べてから語りましょう。

OO .. Object Oliented の略。「オブジェクト指向」の意。
   詳細はとりあえず http://e-words.jp/?w=%83I%83u%83W%83F%83N%83g%8Ew%8C%FC 等を参照。

関連スレ:

【常識】 OO厨房は戦場では必要無し! 【事実】
  http://pc3.2ch.net/test/read.cgi/tech/1041230298/

【C++】2ちゃんねらーはOO嫌い?【Java】
  http://pc3.2ch.net/test/read.cgi/tech/1026974531/
0153デフォルトの名無しさんNGNG
>>152
全然違うと思うが。

って言うかみんなそれくらいわかってるでしょ。デザインパターンまで読んでるなら。
0154デフォルトの名無しさんNGNG
>>153
同意。勉強不足だな。
0155デフォルトの名無しさんNGNG
>>153
わかってらっしゃるそうなので、
共通点と相違点を述べてみてください。
0156デフォルトの名無しさんNGNG
継承は静的。たとえば、実行時に親クラスを変更することは不可能。
コンポジションは動的。たとえば、ポリモーフィズム等を利用して、
利用しているクラスをまるごと差し替えてしまうことも可能。
0157デフォルトの名無しさんNGNG
>ヌヒよ、またTemplateMethodパターンはあまり可能性のないパターンよ。
そりゃないってw

>>156
継承はポリモーフィズムが絡んでくるけど
コンポジションは絡んでこない。
ってだけでは?
そもそも
>たとえば、ポリモーフィズム等を利用して、
>利用しているクラスをまるごと差し替えてしまうことも可能
の意味がわからんのだけど
簡単なコードでも書いてくれるとありがたいかも
0158デフォルトの名無しさんNGNG
そとらてじ
0159デフォルトの名無しさんNGNG
State オブジェクトや Strategy オブジェクトを差し替えるってことじゃない?
AbstractState から継承して ConcreteStateA、ConcreteStateB… を作り、
利用する側は AbstractState 型への参照を保持するんだし。

151 の記事の要約になるけど、
ホワイトボックス型利用なのか、ブラックボックス型利用なのかが大きな違いだと思う。
前者は実装を意識しなきゃいけないけど(下手すると親クラスを変に弄ったりね)、
後者はインタフェイスが理解できていればいい。
0160デフォルトの名無しさんNGNG
ストラテジーは言語機能に多態がないと、
使う気しないのは確かだな。
そういう意味で、ポリモーフィズムを利用してるって意味かな?
クラスを差し替えることに、ポリモーフィズムを使うって意味かと思ったよ。

ただ、継承は静的と書いてしまうと
誤解が生じるような。
継承には差分プログラミングと、実行時ポリモーフィズム
の二つの意味があるわけで。
言語によるという突っ込みはなしで。
C++、Javaの話。
0161デフォルトの名無しさんNGNG
import Mode;
import DefaultMode;
import SpecialMode;
public class Sample {
 private Mode myMode;
 public void dynamicFunc(boolean mode);
  if (mode) {
   this.myMode = new DefaultMode();
  } else {
   this.myMode = new SpecialMode();
  }
  this.myMode.execute();
 }
}
0162デフォルトの名無しさんNGNG
実装継承はモロにホワイトボックスですね
相手とかなりの密結合になる。

コンポジションは基本的にインターフェース経由だから、
一応ブラックボックスになるのかな。
0163デフォルトの名無しさんNGNG
なるほど。
で実際、実装継承全く使わないって人いる?
0164デフォルトの名無しさんNGNG
>>163
普通はフレームワーク的なクラスを作って継承するでしょ。
0165デフォルトの名無しさんNGNG
>>164
便利だな。あれ。
0166164NGNG
?(あれって何?)
0167デフォルトの名無しさんNGNG
どっちにしろ、カプセルの上から被せ、何もかも隠蔽する継承だけになった場合、
包含との違いが意味的なものだけになってしまい、それは単に親クラスに対して
Delegationしてるだけって事になってしまう。
そうなると、継承とコンポジションはその境を失う。

...そして最後には実体(Instance)のみが存在しdelegationを行うと言う、
いわゆる"Self"のような言語がOOの世界を支配する。
0168デフォルトの名無しさんNGNG
>>167
Selfマンセー
0169デフォルトの名無しさんNGNG
ホワイトボックスに何故拘るヤシが居るのか判らん。
継承って、基本中の基本だよねぇー。
継承と委譲の使い分けって、Javaの言語仕様決めた時点である程度決着付いてる気がしてた。
0170デフォルトの名無しさんNGNG
> それは単に親クラスに対してDelegationしてるだけ

そう、継承にそれ以上の意味があるのかなあ、と思った次第であります。
0171デフォルトの名無しさんNGNG
>>170
委譲のように各々のメソッドのラッパーを書かなくても、
勝手に親の持つメソッドを検索してくれるじゃないか。

つまり………楽ができるのさ。
0172デフォルトの名無しさんNGNG
親クラスへのポインターを動的に変更可能にしたら?
↓
クラスの動的変更が可能になる
↓
クラスって特別な仕組みを無くして、インスタンス継承可能にすれば、シンプルで良い
↓
Selfウマー
0173デフォルトの名無しさんNGNG
Javaの実装継承って、method overrideでメソッド丸ごと入れ替えちゃうのがダセー
↓
CLOSのMIXINでbeforeメソッドとかafterメソッドとかあったジャン
↓
HyperJ & MixJuice ウマー
0174デフォルトの名無しさんNGNG
面白そうだけどリソース的に(゚д゚;)マズーな予感
0175デフォルトの名無しさんNGNG
リソースって何の事?
クラス間のコード共有に関する解決策の事?
それともセキュリティ・マネージャの件(じゃないよね)?
0176デフォルトの名無しさんNGNG
>親クラスへのポインターを動的に変更可能にしたら?
ソレダ!!!
0177デフォルトの名無しさんNGNG
CLOSのメソッド・セレクターとかいう仕組みがあったっけ。
第一引数と第二引数が共に整数なら、 plus(int,int)
第一引数と第二引数が共に実数なら、 plus(float,float)
第一引数が整数で第二引数が実数なら、plus(int,float)
第一引数が実数で第二引数が整数なら、plus(float,int)
を呼び出す、と。

で、この辺りの処理は(primitive使わなければ)Javaのreflectionパッケージで記述できるんですけど、、、
メソッド呼び出しのオーバーヘッドが大きそう…
#まぁ、分散オブジェクト〜Web寂びースの呼び出しより軽いからいいか。

0178デフォルトの名無しさんNGNG
>>177
オーバーロード?
0179デフォルトの名無しさんNGNG
>>177
それって単なるオーバーロードでは?
0180デフォルトの名無しさんNGNG
>で、この辺りの処理は(primitive使わなければ)Javaのreflectionパッケージで記述できる

それをワザワザ記述するってのが、どうか。
0181174NGNG
>>175
プロトタイプ方式の事。
インスタンスごとにメソッド持つんだからメモリ多く必要だろうし
実行時に継承するとCPU食うじゃん

Selfの資料見当たらない・・・
詳しいサイト教えて
0182デフォルトの名無しさんNGNG
>>178
のん。CLOSでは
上記の処理を、例えば switch case文みたいので記述する(Lispならcond)とか、
もっと効率を考えて、引数のクラスIDからハッシュを計算してHashtableからメソッド検索、
とかしてたらしいです。
0183デフォルトの名無しさんNGNG
>>177
つまりPerlOO風に、パラメータの取り扱いも含めて1つのメソッドにしよう、と。
0184デフォルトの名無しさんNGNG
>172

NewtonScript ってクラスじゃなくてインスタンスベースのOO言語も
そんな感じなんだけど、コレの骨子は親インスタンスは ROM や FLASH ROMに
置いたまま、例えば書き換わるメンバ変数(property)だけ子インスタンスが持つ、
なんてことを実現して時間空間の両面でリソースを減らすことにあるんだよね。
copy on write みたいな感じで面白い。

役に立たないマメ知識でした。
0185177NGNG
スマソ、話が飛びすぎますた。反省しまつ。
0186デフォルトの名無しさんNGNG
>そう、継承にそれ以上の意味があるのかなあ、と思った次第であります。
だから、ポリモーフィズムだって。
0187177NGNG
補足。
CLOSのはメソッド・セレクターじゃなくメソッド・ディスパッチャーだった気がしますた。
で、メソッド・ディスパッチャーみたいな仕組みを、リフレクティブに、記述対象言語自身で記述できれば、
before & after みたいな仕組みを作るのが楽だよねぇー、って言いたかったのです。

>>181 & >>184
そっすね。
ところで、インスタンス・ベースのOOと、アスペクトみたいなのの、融合って例はないんでしょうか?
0188デフォルトの名無しさんNGNG
クラスベースでモデリングする上で継承という概念は有用である。
0189デフォルトの名無しさんNGNG
>リフレクティブに、記述対象言語自身で記述できれば、
>before & after みたいな仕組みを作る
事のメリットがわからない上に、
できない理由がわからないんだけど。
0190デフォルトの名無しさんNGNG
参考資料

http://web.archive.org/web/20001017024220/www.zzz.or.jp/~iizuka/EOO/Japanese/oofaq-j/oo-faq-S-3.2.html
(「委譲/プロトタイピング」のオブジェクト指向パラダイムって何ですか?)
0191デフォルトの名無しさんNGNG
>>189
できないって言ってないってばぁー。
メリット?
アスペクト指向みたいな事やるのに、
ソースやらバイナリを改変するアプローチだけじゃなく、
しこしこコードで記述する方法を使った方が手っ取り早いケースもあるのでは?
0192デフォルトの名無しさんNGNG
>しこしこコードで記述する方法を使った方が手っ取り早いケースもあるのでは?
トランスレータを作るって意味でしょ?
そういう方法でもいいんじゃない?
拡張の程度によって
プリプロセッサみたいなのでやるのか
トランスレータにするのか
バイナリにする(言語機能を利用しない)のかを
決めればいい。
0193デフォルトの名無しさんNGNG
>>192ポカーン
0194デフォルトの名無しさんNGNG
>>190
一子相伝/終身雇用制で継承するより、
即戦力になるプロをスカウトして、権限委譲した方が
今っぽいじゃん。能力主義って感じだしぃー。
↓
委譲>>>>>>>>>>>>継承
↓
Smalltalk=継承ベースのOO言語
Self=委譲ベースのOO言語
↓
Selfウマー
0195デフォルトの名無しさんNGNG
実装継承って、多分昔言われていた差分プログラミングを実現するための
ものだと思う。
今はOOの使い方がだいぶ研究されて、委譲を使ったプログラミングの方が
いいじゃん、ってことになっているのでは。
つーわけで、実装継承=過去の遺物ってことでよろしいか?
0196デフォルトの名無しさんNGNG
> 今はOOの使い方がだいぶ研究されて、委譲を使ったプログラミングの方が
> いいじゃん、ってことになっているのでは。
何でもかんでも実装継承で解決するのは止めて、適材適所で使えってトコロで
落ち着いてると思うけどな。

template method やなんかは、実装継承を使ったほうがスマートに書けるし。
実際、大規模なフレームワークを提供するクラスライブラリの類は、だいたい
実装継承を使ってるでしょ。
0197デフォルトの名無しさんNGNG
見た目が実装継承(Javaならextends)でも、
実際のところはCompositionに近いこともあるけどなあ。

フレームワークが提供する抽象クラスのサブクラスをアプリ側で
実装するなんて場合、実装継承に見えるけど、実際は
抽象クラスがサブクラス実装部分をcompositeしてるんじゃないかな。
ただ、委譲コードを書くのはメンドイし、ミスを防ぐためにも
実装継承という方法で制約をかけているのかもしれないけど。
(protectedキーワードが便利!)

となると実装継承ってsyntax sugarか?うーん
便利なことは便利なんだが...
0198デフォルトの名無しさんNGNG
実装継承がダメっていうわけじゃなくって、
変な実装のオーバーライドするのがダメなんじゃないかな。
template methodなんかは、だいたいJavaならabstractなメソッドか、
単純なデフォルトメソッドとして定義するでしょ。
これって、要するにスーパークラスの作成側が、あらかじめ
オーバーライドされることを想定しているわけで。
これをオーバーライドするのは、実装継承の良い使い方だと思う。
既存のコードの修正したい部分をオーバーライドで
変更するようなやり方は、悪い使い方だと思う。
0199デフォルトの名無しさんNGNG
節を追うごとに
class Panel2 extends Panel1
class Panel7 extends Panel6
と継承しては機能追加する恐ろしい Java 参考書があった。
0200デフォルトの名無しさんNGNG
> 既存のコードの修正したい部分をオーバーライドで
> 変更するようなやり方は、悪い使い方だと思う。
それはまさに差分プログラミングなワケだが、見通しが立つ範囲でやる分には
問題ないと思う。ただ、この「見通しが立つ範囲」ってのが曲者で、改修を
重ねて見通しが悪くなったら、早めにリファクタリングしないと死ぬけど。

実例を挙げると、バイナリフォーマットを解析してメモリに読み込むような
プログラム。最初に作ったバイナリフォーマットに、後にちょっとした拡張
が施された場合(良くある話)、if 文で条件分岐して対応するよりは

1. ファイル解析を strategy パターンを使って書く。
2. 元のファイル解析ルーチンを継承して、拡張フォーマット対応のファイル
解析ルーチンを作る。

とした方が見通しが良くなる。

ある程度ファイルフォーマットの拡張が重なって元のものとかけ離れてきたら、
そこで実装継承をやめて一から書き直し。
0201デフォルトの名無しさんNGNG
>>200
そうそう、差分プログラミングも使い方によっては便利だけど、
やめどきを知っていないと、あっという間にひどいプログラムになるよね。
ある意味、上級者向けだと思う。
でも、OOのメリットのなかで初心者に一番説明しやすいのは
差分プログラミングなんだよな。
0202デフォルトの名無しさんNGNG
>ある程度ファイルフォーマットの拡張が重なって元のものとかけ離れてきたら

これって、それがある程度事前にわかっている場合は、
「ファイルを扱う」と「データの解析をする」を分離しておいて、コンポジット化すれば
いいのではないでせうか。
で、解析部のテンプレートとして、>>198 を適用する...って、
例として出された内容に言うのも筋違いな気がするのですが、気になって眠れないぃぃぃ...。
0203デフォルトの名無しさんNGNG
> 「ファイルを扱う」と「データの解析をする」を分離しておいて、
にしても、データ解析部分は strategy になるような。
0204デフォルトの名無しさんNGNG
実例を挙げると、バイナリフォーマットを解析してメモリに読み込むような
プログラムをつくってみよう
0205デフォルトの名無しさんNGNG
>>204
一昔前にDHCPメッセージ解析するの作ったけれど。
0206デフォルトの名無しさんNGNG
>>149
> ヌヒよ、TemplateMethodパターンは継承のほうがわかりやすいよ。
> だが、Stateパターンは委譲のほうがわかりやすいよ。
> ヌヒよ、またTemplateMethodパターンはあまり可能性のないパターンよ。
TemplateMethodとStateは畑が違うものでないかい。

多重継承も禁止しているように、クラスには継承できないクラスもあるのだ。
継承して欲しくないときにfinal宣言。
言語によってはそういう指定(final)をできないものもあるかもしれないが。

C++しか使ったことがない沢村にわかわんだろうけど
継承を許されていないクラスには委譲をつかうしかないのだ。
逆に継承しないと使えないクラスもあるのだ。
0207デフォルトの名無しさんNGNG
人によってスタンスがあると思うけど
俺の場合は
オーバーライドを使う=ポリモーフィズムを使う
というスタンスかも。

単純に親クラスのコードを利用したいだけなら
コピペすると思う。
もちろん、そういう状況にならないように設計できる余地がある時は
そうするだろうし。

0208デフォルトの名無しさんNGNG
>>207
インターフェース型による多態の立場は・・・?
0209デフォルトの名無しさんNGNG
質問。これも多態?
#include <iostream>
class A {
public:
  void print() { std::cout << "A" << std::endl; }
};
class B {
public:
  void print() { std::cout << "B" << std::endl; }
};

template<typename T> void print(T t) {
  t.print(); // これ
}

int main() {
  A a;
  print(a);
  B b;
  print(b);
  return 0;
}
0210デフォルトの名無しさんNGNG
>>209 まるでメソッド(メンバ関数)をオーバーロードしているだけに見える。
0211デフォルトの名無しさんNGNG
>>209
本来の多態(polymorphism)の意味は、
ある変数に複数の型の値を代入できる点にあるから、
t.print();が多態かどうかというのは答えようがないと思うが。
0212209NGNG
>>211
そういう意味なの?
多態って、オブジェクトにメッセージを送ったときに、
そのオブジェクトの種類に応じたメソッドを実行する機能
だと思っていた。
0213211NGNG
>>212
それはメソッドの「動的束縛」
0214211NGNG
>>212
ついでに言うと、

> そのオブジェクトの種類に応じたメソッドを実行する機能
が
> その表現式の型に応じたメソッドを実行する機能
ならば、メソッドの「静的束縛」
0215名無し@沢村NGNG
>>211
ヌヒよ、本来の多態(polymorphism)の意味は、変数じゃないよ。
あるオブジェクトに複数の型のオブジェクトを代入できる点にあると思うよ。ヌヒよ。
0216デフォルトの名無しさんNGNG
シ尺木寸キター
0217名無し@沢村NGNG
まあ、オブジェクトに複数の型のオブジェクトを代入してもほとんどの香具師はswitch case文でしかそれを切り替えられないだろうけどね…。
0218デフォルトの名無しさんNGNG
残りの人はどうするの?
メソッド検索でもしてみる?
0219デフォルトの名無しさんNGNG
皆のもの、沢村先生がありがたい書き込みをなされたぞ!
「オブジェクトにオブジェクトを代入する」というすばらしいお言葉の意味
を知恵を絞って考えよ!しかも大抵の人は「switch case でしか切り分けられ
ん」そうだ。C++ とか Java だと代入する先は変数だしなぁ。しかも大抵は
動的束縛で switch とか要らんよなぁ。わからん...
0220名無し@沢村NGNG
>>219
ヌヒよ、オブジェクトにオブジェクトを代入するがわからんか?ヌヒよ?
つまりこういうことよ↓
Kintama kintama;
Omanko *omanko;
omanko=&kintama;
omanko->sex();

ヌヒはオブジェクト指向の初歩を勉強しろ!!ヌヒよ!!
0221デフォルトの名無しさんNGNG
ははー。それはオブジェクトというかポインタを代入しているように
見える漏れは真の大バカ野郎とうい事ですな。よっくわかりました。
....沢村様、重ね重ね申し訳ないのですが、大半の人間が使う
switch case とやらも例を出して明快に説明していただきたいのですが。
0222沢村@代理NGNG
import Mode;
import DefaultMode;
import SpecialMode;
public class Sample {
private Mode myMode;
public void dynamicFunc(boolean mode);
if (mode) {
this.myMode = new DefaultMode();
} else {
this.myMode = new SpecialMode();
}
this.myMode.execute();
}
}
0223名無しさん@EmacsNGNG
デザパタか。
で、コレがどうしたの?
0224名主さん@TeXmacsNGNG
どこがデザパタやねん
0225名無しさん@EmacsNGNG
simple factory
の例じゃないの?
0226デフォルトの名無しさんNGNG
話し合うだけじゃなかなか理解できないから、
なんか小さいプログラムOOで作ってみせあっこしようよ。
前やってたオセロみたいにさ。
0227デフォルトの名無しさんNGNG
>>226
OK。Hello World!作れ。OOで。
0228デフォルトの名無しさんNGNG
>>227
TemplateMethodパターンで作ってけど、面白くないよ・・・
public abstract class AbstractHelloWorld{
public void execute(){
hello();
}
public abstract void hello();
}
public class HelloWorld extends AbstractHelloWorld{
public abstract void hello(){
System.out.println("Hello World!")
}
}
0229デフォルトの名無しさんNGNG
public abstract void hello(){
0230デフォルトの名無しさんNGNG
OOらしく拡張しよう
public class HelloWorld100 extends AbstractHelloWorld{
public abstract void hello(){
for( int i = 0 ; i < 100 ; i ++ )
System.out.println("Hello World!");
}
}
0231デフォルトの名無しさんNGNG
要するに、テムプレィトー、テムプレィトー、って逝ってるヤシは、
継承覚えるのがやっとこさの××なのね。

#ウチの近所にも一杯いるけど(w
#「パターン大事だよねぇ、テンプレィトゥーメソッドゥ」とか
#「ホワイトボックスが重要だ」とかいつも逝ってる
0232デフォルトの名無しさんNGNG
>>231はHello Worldの意味がわからない疎外感に耐えられなくて煽りに転じました。
0233デフォルトの名無しさんNGNG
231の近所って公園しかないぞ?
0234デフォルトの名無しさんNGNG
>>230
HelloWorld100:2: abstractなのに本体持ってるんで、コンパイル中止しますた。
0235デフォルトの名無しさんNGNG
>>233
ん?いつも漏れの席の後ろで喧々諤々騒いでるヤシの事だけど
0236デフォルトの名無しさんNGNG
>>235
ああ。木村か。

でも、あいつお前の1/30だぞ。テストの順位。
0237デフォルトの名無しさんNGNG
木村圏萌ぇ〜
0238デフォルトの名無しさんNGNG
>>236
2/30位って、どれくらいアタマぃぃのヨ?
0239デフォルトの名無しさんNGNG
>>233
ワラタ
0240デフォルトの名無しさんNGNG
マ板以下のゴミスレでつね。
0241デフォルトの名無しさんNGNG
おまいら、遊んでばっかいないでOOの勉強しる。
0242デフォルトの名無しさんNGNG
>>230-231
これJavaだよな? Javaもどきだったら知らんが、
Javaだったらコンパイルできなく当たり前
abstract外せ
>>230 は本当にOOらしく拡張されたのか?
ただのポリもーフィズムだけってのはのう....。

Hello World表示するだけでこんなことやるのも何か寒い。もっと芸見せておくれ
0243デフォルトの名無しさんNGNG
あれだ。レンタルビデオ屋をモデリングすれ。
0244デフォルトの名無しさんNGNG
そういや、クリスマス・イブの時、
公園で耳押さえて、奇声あげながら走っている香具師がいたな。
0245デフォルトの名無しさんNGNG
>>243
UMLシルバーの試験対策にちょうど良さそうだな。
0246デフォルトの名無しさんNGNG
それが沢村の真の姿なのだぁー
0247デフォルトの名無しさんNGNG
>>245 あれブロンズと比べるとかなりムズイ。去年の秋は受からんのでした。
修行が足りぬか。修行修行
0248デフォルトの名無しさんNGNG
有名だけど、Greedゲームなんかどうよ?
http://www.ogis-ri.co.jp/otc/objday2001/category6W1plus.html
0249デフォルトの名無しさんNGNG
>>217
> まあ、オブジェクトに複数の型のオブジェクトを代入してもほとんどの香具師はswitch case文でしかそれを切り替えられないだろうけどね…。

おお、polymorphic typeなswitch文をつくってくださるのか!
私のような下々の人間には効率的な実行系を想像だにできん。
ありがたや、ありがたや・・・
0250名無し@沢村NGNG
そういえばヌヒ等よ、俺はプログラム勉強最初の頃は非OOでプログラミングしてたよ(当然だけどね)。
で、その頃の非OOのやり方というのはね、まず変数はすべてグローバルとし、変数を宣言だけするファイルをsubsti.hとしてひとつにまとめ一番おおもとにしていたね。
で次にそのsubsti.hをインクルードしてdeclare.hをつくっていたんだが、これは関数のプロトタイプと構造体だけを列挙するファイルなんだ。
次にdeclare.hをインクルードしてそれぞれの機能に応じた関数を定義するファイルをつくっていたよ。
ファイル処理ならfile.h編集ならedit.hという風にね。プログラムで使用する関数の定義はすべてこの.hで行なっていた。
だからcppファイルはつねにそれらをすべてインクルードした最後のファイルひとつだけだったよ。
ヌヒ等よ、このやり方は非OOでありながらOOに非常に近いし、またとても読みやすいという利点があったよ。
変数はすぶてひとつのファイルを開くだけで一覧できるし、static宣言もexturnも必要ないからね。
まさに一種のデザインパターンといえるだろうね。俺は生まれつきOOをやる資質が備わっていたんだろうね。
0251デフォルトの名無しさんNGNG
>>250

構造化。
0252デフォルトの名無しさんNGNG
まず変数はすべてグローバルとし、
(中略)
まさに一種のデザインパターンといえるだろうね。俺は生まれつきOOをやる資質が備わっていたんだろうね。
■ このスレッドは過去ログ倉庫に格納されています