我有一个定义“模块”的接口(interface):
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 包含 AIMModule,因此 addModule() 需要获取 AIMModule。但在实现层面, moduleStack 小部件插入了一个SectionStackSection,因此接口(interface)的“模块”需要根据实现进行强制转换。
这可行,但感觉不对。如果有人通过扩展除SectionStackSection 之外的其他内容来实现我的AIMModule 接口(interface),并将该AIMModule 传递到addModule() 中,则该转换将会中断。这似乎不对。
这个坏了吗?如果是的话,修复方法是什么?
最佳答案
这是错误的,因为您从不检查传递的参数是否是您期望的类型,即使如此,它也应该只采用您期望的类型。但这是不可能的,因为您的模块容器可以包含任何类型的模块。
每个模块容器只处理一种类型吗?如果是这样,请使用泛型。如果不是,这总体上是一个糟糕的实现,因为您认为它总是不是这样的。
关于java - 这种转换是否意味着多态性设计被破坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12701114/