我有一个定义“模块”的界面:
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(),那么该转换将会中断。这似乎不对。
这会坏吗?如果是,那么修复它的方法是什么?
答案 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 );
}
}