2

我有一个定义“模块”的接口:

public interface AIMModule {
    // Details not relevant
}

另一个为这些模块定义了一个容器:

public interface AIMModuleContainer {
    public void addModule( AIMModule module );  
}

这些“模块”实际上是 GUI 构造,因此我的容器的实现扩展了我正在使用的 GUI 工具包的 HLayout 小部件。它包含一个名为 moduleStack 的 SectionStack。SectionStack.addSection( SectionStackSection ) 将一个节堆栈添加到 GUI 中,因此我的“模块”容器抽象如下所示:

public class UserContainer extends HLayout implements AIMModuleContainer {

@Override
public void addModule( AIMModule module )
{
    moduleStack.addSection( (SectionStackSection)module );
}

}

因此,模块实现扩展了一个名为 SectionStackSection 的小部件:

public class AccountInformationModule extends SectionStackSection implements AIMModule {
    // Details not relevant
}

问题是在调用 addSection() 的 addModule() 中进行转换。AIMModuleContainer 包含 AIMModule,因此 addModule() 需要获取 AIMModule。但是在实现层面,moduleStack小部件插入了一个SectionStackSection,所以接口的“模块”需要根据实现进行强制转换。

这行得通,但感觉不对。如果有人通过扩展 SectionStackSection 以外的东西来实现我的 AIMModule 接口并将该 AIMModule 传递给 addModule(),那么该转换将中断。这似乎不对。

这是坏了吗?如果是,修复它的方法是什么?

4

2 回答 2

2

这被破坏了,因为您从不检查传递的参数是否是您期望的类型,即使那样,它也应该只接受您期望的类型。但这是不可能的,因为您的模块容器可以包含任何类型的模块。

每个模块容器是否只处理一种类型?如果是这样,请使用泛型。如果不是,这只是一个糟糕的实现,因为你认为它总是不是它。

于 2012-10-03T02:27:46.373 回答
0

根据您提供的代码,您似乎需要一个SectionStackContainer应该由UserContainer

public interface SectionStackContainer {
    public void addSectionStack( SectionStack sectionStack );  
}

public class UserContainer extends HLayout implements SectionStackContainer {

    @Override
    public void addSectionStack( SectionStack sectionStack )
    {
        moduleStack.addSection( sectionStack );
    }

}
于 2012-10-03T11:07:08.533 回答