Monday, 15 June 2015

継承と移譲

まぁ、いつもの話なんだけど。Java だと他のクラスを継承することができて、

* 継承したメソッドをちょっと修正

というのが可能。@Override とかいうannotationで、ちゃんと上書きしているかどうかを調べられます。

なのだが、

* まず、元のメソッドを全部コピペって、それを修正

ってのがあるらしく。だから、それやらずに、

* 元のメソッドを呼び出せばよいだろ

ってことですね。同じコードを二度書いたら警告が出る IDE ってないのか?

なのだが、同じ通信路を圧縮ありなしで選択という場合で、

* 圧縮なしを継承して圧縮ありを作る

というのをやってもらったんですが、

* 通信路は一つなのにインスタンスは二つ

というのをやられてしまって。それは、動作がおかしくなるな。受信スレッド二つはダメだろ?

というわけで、そういう時には、継承ではなくて移譲を使う方が良い。つまり、

* ちょっと変更してから、元のインスタンスのメソッドを呼び出す

わけですね。これだと、元のインスタンスの動作を妨害しないのが良い。初期化時に元のインスタンスを渡してやる必要がありますが。

移譲の方がコードの依存性を下げられると言われているんですが、残念ながら Java には移譲に関する言語機能的なサポートはない。なので、

void hoge() { deleget.hoge(); }

みたいなのをたくさん書く羽目に。継承だと、こういうのは書かなくてすむのだが...

なんか、良い方法ないのかな。

No comments: