我有定義了一個「模塊」的接口:這個演員是否意味着一個破碎的多態設計?
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(),那麼這個強制轉換將會中斷。這看起來不正確。
這是壞了嗎?如果是這樣,那麼修復它的方法是什麼?
是的,這是破實施。 –
UserContainer不是AIMModuleContainer,因爲它不能包含AIMModules。所以你通過不實現AIMModuleContainer來「修復」它。 –
你也可以利用訪問者來獲得雙重調度,這通常是你在這裏需要的。 – Mik378