2

假设我有两个接口和一个行为类:

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 来扩展这两个接口并使用那个接口吗?

谢谢。

编辑:回答,我应该扩展接口,因为我不想依赖于实现类型。将它们结合起来可以让我使用具有相同代码的多种类型。

4

3 回答 3

2

仅基于查看创建 AdempiereTab 的代码片段,我的第一个想法是,您可以简单地将其变量类型声明为 AdempierTab 而不是 Creable。您不需要使用抽象类型 Creable,因为您已经知道这是您将在其上执行接口方法的类型。

第二个想法,即使您知道 Creable 是 AdempiereTab(来自前面的代码行),最好在强制转换之前检查使用 instanceof 以避免任何异常。这证实了您应该将“includedTab”声明为 AdempiereTab。

然而,在不了解应用程序的太多上下文的情况下,我确实对 HasDependencies 接口提出了质疑。纯粹基于名称,它本身似乎更像是一种方法。但它暴露的行为似乎令人困惑:create 和 generate 都返回 void。对我来说,这只是引出了这个界面是否经过深思熟虑的问题,也许需要重新设计成更清晰的东西。这可能会帮助您避免现在面临的问题。

于 2012-07-25T13:53:37.463 回答
2

有两种设计力量在起作用:使您的界面尽可能小,并尽量减少界面的数量。一般来说,大型接口以后重构的问题更大。

如果您的接口已经在整个系统中使用,您可以将客户端代码拆分为单独的方法或类,创建一个CreableHasDependencies扩展两个接口的接口,或者直接使用类类型。

如果这是您第一次使用接口,则将它们组合起来,因为接口属于客户端代码。

于 2012-07-25T13:49:39.653 回答
0

或者你可以做这样的事情:

AdempiereTab includedTab = new AdempiereTab(getIncluded_Tab_ID(),
                creableElements);
if (!new CreableBehavior(includedTab).hasBeenCreated) {
    includedTab.createDependencies();
    creableElements.getCreatedItems.add(includedTab);
    includedTab.generateDependents();
}

由于AdempiereTab实现了这两个接口,您可以将其传递AdempiereTabCreableBehavior's构造函数。

于 2012-07-25T13:44:24.863 回答