这个演员是否意味着一个破碎的多态设计?

时间:2012-10-03 02:22:06

标签: java casting polymorphism

我有一个定义“模块”的界面:

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
}

问题是在addModule()中强制转换为addSection()。 AIMModuleContainer包含AIMModules,因此addModule()需要采用AIMModule。但是在实现级别,moduleStack小部件会插入一个SectionStackSection,因此需要根据实现来转换接口的“模块”。

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

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

2 个答案:

答案 0 :(得分:2)

这是破坏的,因为你永远不会检查传递的参数是你期望它的类型,即便如此,它应该只接受你期望它的类型。但这是不可能的,因为您的模块容器可以包含任何类型的模块。

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

答案 1 :(得分: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 );
    }

}