継承はOOPの最大の特徴の一つではありますが、得てして
それが開発時、特に機能追加などの変更が発生した場合
の障害になることも多々あります。
この障害を解決してくれるものは何だろう?と考えていて
昨今のトレンドも踏まえると、以下の二つがその代表的な
もののような気がしました。
まず一つ目はAOPの「DI(Dependency Injection)」です。
ログ出力機能などの例が良く出されますが、複数のクラス
に跨って実装される機能を大元のクラスに実装し、継承を
使って対処しようとすると、多重継承の必要が出てきてし
まったりなど厄介なことになります。DIは単にログ出力の
ためのメソッド呼び出しを呼び出し元クラスのソースコー
ド内に記述せずに済むとういコード上の利便性だけでなく、
この継承との不整合を解消してくれるという点に大きな意
味があると理解しています。
ところがDIだけでは解決できない問題があります。それは
クラスを外部から操作するインターフェース側の問題です。
インターフェースも継承が可能ですが、様々なクラスを統
一的に扱うメソッドを一つ作りたいといった場合、そのメ
ソッドの引数として指定するクラスはある特定のインター
フェースを実装させておく必要が生じてしまいます。使う
側のメソッドを一箇所にしたいというニーズのために、わ
ざわざ引数になる可能性のあるクラス全てに特定のインタ
ーフェースを実装させないといけないのは大きな制約と言
えるかと思います。
これを解決してくれそうなのがGroovyなどがサポートして
いる「動的型付け」です。groovyであれば、下記のような
コードを書くことができます。
HumanクラスとCarクラスの間には何の継承関係も共通の
//「人間」クラスの定義
class Human{
name
age
}//「車」クラスの定義
class Car{
name
displacement
}
//「モノ」の名前を表示するメソッド
def dispName(substance){
println "名前は" + substance.name
}//実際にインスタンスを作成してメソッドを呼んでみる
John = new Human(name:"John", age:20)
Porche = new Car(name:"Porche", displacement:3000);dispName(John);
dispName(Porche);
インターフェースもありませんが、dispName()という同
一のメソッドを使って名前を表示させることができます。
こういった柔軟性を持たせることができるのは「動的型
付け」の大きなメリットと言えるかと思います。
「動的型付け」はgroovyに代表されるようなスクリプト
言語の特徴のように捉えられていますが、本来はスクリ
プト言語に限らず実現可能な技術のはずです。
整理をすると、クラスの内部に継承の壁を越えて柔軟な
実装を加えたいというニーズに応えているのが「DI」、
クラスを利用する際に継承の壁を越えて柔軟な呼び出し
を行いたいというニーズに応えているのが「動的型付け」
ということで、クラスの内と外のそれぞれにおいて継承
が抱えている制約を解決していると見なすことができる
のではないかと思います。(もちろん「DI」にしても「動
的型付け」にしても他の活用方法やメリットがたくさん
あります)
継承というOOPの特徴を生かしつつ、この「DI」と「動的
型付け」がうまい具合にJavaの中に取り込まれていくと、
さらに使い勝手の良い言語に進化してくれるのではないか
とひそかに期待しています。