お世話になっております。 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を実装するだけ。

「あとはお湯さえ注げば食える」カップラーメン?


(ってので、解釈合ってます?)