継承ではなくアセンブリ

2592 ワード


上位クラスの機能を再利用するためには,継承がしばしば用いられる.
しかし、継承には以下のような問題もある.

欠点親を変更できません

子が多ければ多いほど、親を変更するのは難しくなります.
また、子を使用するには、親の動作を理解する必要があります.
これにより、サブクラスのパッケージが低下します.
欠点クラスが多くなる

圧縮と暗号化機能を提供するストレージが必要な場合は、
CompressedStorageクラスとEncrypteStorageクラスを継承して実装します.
しかし、圧縮、パスワード、キャッシュ機能のストレージが必要な場合は?
-->3つのレベルを継承しますか?などの新しい組み合わせが現れた場合
クラスが増加します.
欠点継承使用(エラー)

ArrayListを継承し、Containerクラスを再定義します.
put、extract、cancontainメソッドを定義します.
そのため、開発者は
Container c = new Container(5);
if (c.canContain(size2Luggage)) {
    c.put(size2Luggage);
}
위와 같이 코드를 작성했다.

これは荷物を追加するコードです.
オブジェクトの後入力するとIDEは
このオブジェクトが継承するすべてのメソッドもすべて表示されます.
継承されたベースオブジェクトを正しく理解できないと、このような問題が発生する可能性があります.
これはContainerクラスを定義した人のせいです.

暗号化機能が必要な場合
この機能を提供するクラスは継承しないでください.
フィールドまたはメソッドからオブジェクトを作成します.
(=必要に応じて作成)
-->クラスの成長防止
継承ではなくアセンブリ(作成)

定義するストレージクラスに서명 기능を提供するオブジェクトを作成します.

図右側に示すように、ArrayListは提供されるaddメソッドを提供しない.
(つまり、Containerクラス(継承されたクラス)のputメソッドと混同されません.)

クラスを継承する前に조립で実施できないかを十分に考慮する.
機能を再利用するために盲目的に継承を使用しないでください.