CoffeeScript – 抽象クラス

概要

Javaの場合だと、抽象クラスを書く場合には”abstract”宣言をして、具体のクラスで実装すべきメソッドの宣言だけを行うが、CoffeeScript/Javascriptの場合はこれと異なる。

準備

まず、同じ名前executionのメソッドを持つ2つのクラスConcrete1Concrete2を考える。メソッド名は同じだが、各クラスで処理内容は異なる。

次にexecution()について共通な2つのクラスを抽象化したAbstractクラスを導入する。

抽象クラスの導入

CoffeeScript/Javascriptではabstractキーワードがなく、abstractなメソッドも中身が空のもので定義。ただし抽象クラスのままでインスタンス化したときの注意喚起のメッセージを実装。

Javaなどでは型指定が厳格なので、異なる2つのクラスをAbstractクラスで抽象化して、同じメソッドを呼び出すことでクラスごとに特有の処理をさせる。

CoffeeScript/Javascriptでは変数の型がないため、抽象化をしなくてもメソッド名を同じにしておくだけで同じ効果を得る。ただしコンパイル時のチェックなどがない点に注意。

共通部分がある場合

以下のように、2つのクラスで共通の処理と個別の処理が混在している場合を考える。

共通の処理を各クラスごとに実装しているが、コピー/ペースト操作で行うとしてもエラーが入り込みやすく、その後の保守性も悪い。

共通部分の集約(1)

エラー回避と保守性の向上のため、共通部分を一つにまとめる。

  • 抽象クラスAbstractを導入
  • Abstractexecution()メソッドのフレームを集約
  • 共通処理部分commonExecution()Abstractのメソッドとして実装
  • 2つのクラスでAbstractを継承
  • これらの子クラスで、それぞれの個別処理部分のみを実装

Concrete1Concrete2Abstractを継承したことによって2つの具象クラスがAbstractクラスのexecute()メソッドも継承され、具象クラスでexecute()メソッドを呼ぶと、Abstractexecute()メソッドが実行される。

その後、共通部分のcommonExecution()Abstractのメソッドが呼ばれ、specificExecution()については、各具象クラスでオーバーライドされたメソッドが呼ばれる。

共通部分の集約(2)

各具象クラスでexecution()のから書いていくこともできるが、この場合は共通処理が一括してsuper()で実行されるため、「共通の前処理と後処理の間に各クラス独自の処理を置きたい」という場合には適さない。

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です