お世話になっております。 A.中村です。 On Mon, 20 Dec 1999 14:10:07 +0900 "Hideaki Takata" <hideakit / d3.dion.ne.jp> wrote: >Template Methodっていうのは、僕の理解していたとこでは >1、処理の全体の流れを定義し、その中の一部のステップをサブクラスで >定義できるようにする(たとえば、フレームワークを作るように)。 全体の流れでなくてもいいです。 メソッド(の流れ)が複数あってもいいです。 >3、たいていは、スーパークラスではそのメソッドは何もしない >ただのフックである。 #C++やdelphiだと、こーゆー場合は純粋仮想メソッドを使うとこですね。 >5、したがって、Rubyの様な言語では、このようななにもしない >スーパークラスを定義する必要はない。 ちゃいます(と思います(^^;)。TempleteMethodのスーパークラスは、 何もしないスーパークラスとは限らないですので。(ですよね?) えっと。 将棋板みたいな場所で前後左右斜め八方に動ける駒みたいなのを考えたとき class Koma def north;end def south;end def west;end def east;end def northwest; north; west; end def southwest; south; west; end def northeast; north; east; end def southeast; south; east; end end なんて書けるわけですが、このとき「下4つのメソッドは上4つに 依存して出来ている」わけですよね。んで、「上4つはサブクラスで 自由に実装する」ことに決めておいたとしたら… class Horse<Koma def north; pakaran_pakaran(Up) ; end def south; pakaran_pakaran(Down) ; end def west ; pakaran_pakaran(Left) ; end def east ; pakaran_pakaran(Right); end end class Ball<Koma def north; goro_goro(Up) ; end def south; goro_goro(Down) ; end def west ; goro_goro(Left) ; end def east ; goro_goro(Right); end end ここで、HorseもBallも「別になにも書いてないけど、 斜めにも動ける」ってのが味噌です(よね?) で、RubyだとKomaにdef northとかを書く必要がなく、 C++とかだとダミー(純粋仮想)メソッドを取り敢えず書く 必要がある、という差はあります。 んだけど、ダミーを書くかどうかはさておき、どちらも Komaに斜め移動のメソッドが既に「実装」されてる ってのが、味噌です(よね?) 「実装」されてるので、サブクラスは斜め移動について 最早何一つ書く必要もないんです。Interfaceだけが 書いてあって実装の責任がサブクラスにあるとかいうシカケに なってるわけじゃないっす。 時間差実装攻撃、とでもいいましょうか(^^; Rubyだと、Enumerableとかがソレですよね。 「あとはeachさえ実装してくれれば」動くところまで もう出来ているんで、サブクラスではeachを実装するだけ。 「あとはお湯さえ注げば食える」カップラーメン? (ってので、解釈合ってます?)