3

システム内のすべてのオブジェクトに a を格納したいのでBase、 a を格納する 1 つのフィールドを持つという名前のクラスを作成しました。また、データベースに格納できるすべてのオブジェクトにUUID名前を付けたフィールドが必要です。ドメイン層のすべてのオブジェクトがデータベースに永続化されるわけではないため、id追加しません。このフィールドBaseを継承して追加する別のクラスを作成し、両方を必要とするすべてのクラスにそれを継承させることができます。Base

このようなフィールドを追加する目的で存在する階層を作成することは避けるべきですか? より良いオプションはありますか?

4

3 に答える 3

3

非常に単純なアプリケーションでは、継承のみを使用できます。しかし、アプリケーションが複雑になるにつれて、コンポジションを使用すると、クラスはより柔軟になります。したがって、共通の動作、インターフェイスの共通フィールドを定義し、これらの共通の動作を持つクラスにそれらを実装するように要求します。共通インターフェイスの実装を提供し、クラスが呼び出しを実装クラスに委任できるようにします。

次に例を示します。

interface Uniqueness {
    long getUUID();
    void setUUID(long uuid);
}

interface Storable {
    long getId();
    void setId(long id);
}

class UniquenessSupport implements Uniqueness {

    private long uuid;

    @Override
    public long getUUID() {
        return uuid;
    }

    @Override
    public void setUUID(long uuid) {
        this.uuid = uuid;
    }
}

class StorableSupport implements Storable {
    private long id;

    @Override
    public long getId() {
        return id;
    }

    @Override
    public void setId(long id) {
        this.id = id;
    }
}

class Some implements Uniqueness, Storable {

    private UniquenessSupport uniquenessSupport;
    private StorableSupport storableSupport;

    public Some() {
        uniquenessSupport = new UniquenessSupport();
        storableSupport = new StorableSupport();
    }

    @Override
    public long getUUID() {
        return uniquenessSupport.getUUID();
    }

    @Override
    public void setUUID(long uuid) {
        uniquenessSupport.setUUID(uuid);
    }

    @Override
    public long getId() {
        return storableSupport.getId();
    }

    @Override
    public void setId(long id) {
        storableSupport.setId(id);
    }
}

この単純なケースでは定型コードがたくさんありますが、クラスにフィールドやメソッドを追加する場合、これが柔軟性を確保し、コードの重複を避ける唯一の方法です。さらにいくつかのインターフェースがあり、たとえばPayable、のみであり、のみである新しいクラスを作成したい場合はSendable、適切なインターフェースを採用し、クラスをサポートします: +および+のみ。ReturnablePayableUniquenessUniquenessUniquenessSupportPayablePayableSupport

一方、継承を使用する場合は、すべてのニーズに対応するために 、 などからのすべてのメソッドを含む必要がある Base クラスを拡張しますPayableが、クラスはおよび hasSendableのみである必要があります。継承により、、 なども作成します。PayableUniquenessReturnableStorable

于 2013-03-20T22:19:27.073 に答える
0

多くの異なるクラス間で共通するクラスのプロパティ/動作をローカライズするために、継承が実際に行われます。あなたの例はかなり単純化されていますが、それでも継承の合理的な使用のようです。

于 2013-03-20T22:05:48.500 に答える
0

id が単純な get/set を提供するだけの場合、インターフェイスを使用します。getId() や場合によっては setId() などのメソッドを持つ IDbEntity です。

于 2013-03-20T22:08:35.930 に答える