非常に単純なアプリケーションでは、継承のみを使用できます。しかし、アプリケーションが複雑になるにつれて、コンポジションを使用すると、クラスはより柔軟になります。したがって、共通の動作、インターフェイスの共通フィールドを定義し、これらの共通の動作を持つクラスにそれらを実装するように要求します。共通インターフェイスの実装を提供し、クラスが呼び出しを実装クラスに委任できるようにします。
次に例を示します。
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
、適切なインターフェースを採用し、クラスをサポートします: +および+のみ。Returnable
Payable
Uniqueness
Uniqueness
UniquenessSupport
Payable
PayableSupport
一方、継承を使用する場合は、すべてのニーズに対応するために 、 などからのすべてのメソッドを含む必要がある Base クラスを拡張しますPayable
が、クラスはおよび hasSendable
のみである必要があります。継承により、、 なども作成します。Payable
Uniqueness
Returnable
Storable