オブジェクト指向 : なぜ、継承するのか?

と、[id:m-hiyama:20060627:1151371730]を見て思った。
ここでは、特に実装の継承のことを念頭においているのだけれど、どうしてオブジェクト指向の話になるとすぐに継承の話が出てくるのかなと思うことがある。継承なんて、必要なら使えばいいわけで、無理してまで使う必要があるのだろうか?

      • -

TextViewerとTextEditorの例がありましたが、これもどうしてこの間に継承関係を見ようとするのでしょうか。Smalltalkが何年も前に生み出したMVCアーキテクチャに思いをはせれば、これは継承関係で捉えるのではなく、MVCで捉えた方が上手く行くことに気づくはず。
ここでおさらい。

V(iew)
画面描画を専門に受け持つ
C(ontroller)
ユーザーからの入力(キーボード/マウス)を専門に受け取り、イベントを起動する
M(odel)
プログラムの機能部分を受け持つ

TextViewerとTextEditorは、Modelさえ取替え可能にしておけば、ViewとControllerは同じものでよいはずです。
以下、概念を理解するために、シンプルなModelの例をJavaで記述します。

class TextModel {
  TextView v;
  abstract void editText(String s);
}

class ReadOnlyTextModel extends TextModel {
  void editText(String s) { /* do nothing */ }
}

class EditableTextModel extends TextModel {
  void editText(String s) {
    v.insertText(s);
  }
}

TextControllerが受け取ったキーボードの入力は、TextModelのeditText()に渡されます。ReadOnlyTextModelはeditText()の中で何も処理が行われないため、入力文字列は画面に描画されません。それに対し、EditableTextModelはeditText()で、入力文字列がTextViewのinsertText()に渡されるため、画面に描画されます。
もし、TextViewの入力エリアや文字の色を変えたり枠線の形状を変化させたりしたい場合も、同様に、Modelを修正していけば、ViewやControllerの修正は不要になるわけです。