2

重複の可能性:
継承よりも構成を優先しますか?

なぜ(またはどのような場合に)、継承の短所が非常に多いのに、構成ではなく継承を検討する必要があるのだろうか。

  • スーパークラスのメソッドを呼び出すサブクラスのメソッドを実装/オーバーライドする場合、スーパークラスの別のバージョン(おそらくライブラリ)がコードを壊さないという保証はありません。
  • sublclassメソッドと同じシグニチャを持つが、戻りタイプが異なる新しいメソッドがスーパークラスに表示される場合、クラスはコンパイルされません。

ですから、地球上でどのように信頼できるのか想像できません。スーパークラスの作成者はパフォーマンスを向上させたい場合があり、クライアントコードが機能しなくなる可能性があります。

だから私の質問は:

  • これらの問題はどのように解決されますか(たとえば、標準のJavaライブラリで)?
  • 継承と構成をいつ使用するのですか?
4

1 に答える 1

6

最初の異議は作曲にも当てはまります。呼び出すメソッドの実装が変更された場合、コードが壊れないという保証はありません。

新しいバージョンのAPIに問題があることにすぐに気付くので、2番目の異議は実際には良いことです。

この問題は、継承/構成とはあまり関係がありません。クラスのパブリックコントラクトがバージョンごとに変わる場合は、これらの変更に対応するためにコードを変更する必要があります。この問題は、下位互換性のない変更を回避することで解決されます。新しいAPIを提供することが解決策になる可能性があります(たとえば、io、nio、nio2の順に参照してください)。それ以外の場合は、APIのあるバージョンから別のバージョンへの移行に役立つリリースノートと移行ドキュメントがあります。

継承は、クラスと他のクラスの間にis-a関係がある場合に使用されます。コンポジションは、クラスと他のクラスの間に関係がある場合に使用されます。

于 2012-06-14T11:18:23.003 に答える