2つのインターフェースと1つの動作クラスがあるとしましょう。
public interface Creable {
public boolean belongsToSystem();
public List<Creable> getCreatedItems();
}
public interface HasDependencies {
public void createDependencies();
public void generateDependents();
}
public class CreableBehavior {
private Creable creableObject;
public CreableBehavior(Creable creableObject) {
this.creableObject = creableObject;
}
public boolean hasBeenCreated() {
return !creableObject.belongsToSystem() && !creableObject.getCreatedItems().contains(createdObject);
}
そして、このコードは次のとおりです。
Creable includedTab = new AdempiereTab(getIncluded_Tab_ID(),
creableElements);
if (!new CreableBehavior(includedTab).hasBeenCreated) {
includedTab.createDependencies();
includedTab.getCreatedItems().add(includedTab);
includedTab.generateDependents();
}
AdempiereTabは、CreableとHasDependenciesの両方を実装しています。問題は、CreableとHasDependenciesの両方のインターフェースを使用する必要があることです。
このようにキャストする必要があります:
if (!new CreableBehavior(includedTab).hasBeenCreated) {
((AdempiereTab)includedTab).createDependencies();
includedTab.getCreatedItems().add(includedTab);
((AdempiereTab)includedTab).generateDependents();
}
または、両方のインターフェイスを拡張する新しいインターフェイスCreableWithDependenciesを作成し、代わりにそのインターフェイスを使用する必要がありますか?
ありがとう。
編集:回答済み、実装タイプに依存したくないので、インターフェイスを拡張する必要があります。それらを組み合わせると、同じコードで多くのタイプを使用できるようになります。