2012-10-03 35 views
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 
} 

的問題在於,它在addModule()中將其調用addSection()。 AIMModuleContainer包含AIMModules,所以addModule()需要一個AIMModule。但是在實現級別上,moduleStack小部件插入了一個SectionStackSection,所以需要根據實現來轉換接口的「模塊」。

這有效,但感覺不對。如果有人通過擴展除SectionStackSection之外的其他東西來實現我的AIMModule接口,並將該AIMModule傳遞給addModule(),那麼這個強制轉換將會中斷。這看起來不正確。

這是壞了嗎?如果是這樣,那麼修復它的方法是什麼?

+1

是的,這是破實施。 –

+0

UserContainer不是AIMModuleContainer,因爲它不能包含AIMModules。所以你通過不實現AIMModuleContainer來「修復」它。 –

+0

你也可以利用訪問者來獲得雙重調度,這通常是你在這裏需要的。 – Mik378

回答

2

這是打破,因爲你從來沒有檢查通過的參數是你期望它的類型,即使如此,它應該採取你期望它的類型。但是這是不可能的,因爲你的模塊容器可以包含任何類型的模塊。

每個模塊容器只處理一種類型嗎?如果是這樣,請使用泛型。如果沒有,這只是一個糟糕的實現,因爲你認爲它永遠是不可能的。

+0

是的,模塊容器只能處理一種類型。目前的實現是SmartGWT,所以我使用了該工具包的SectionStackSection。我將不得不實施至少一次,因此需要確保我不會將任何來自SmartGWT的任何內容泄漏到此模塊界面中。你可以擴大一點,如何泛型可以用來實現這一點? – delf

+0

使ModuleContainer類爲'AIMModuleContainer '然後讓set方法接受'M module',並且get方法返回'M',所以AIMModuleContainer 將從它的get中返回一個AccountInformationModule,並且你可以在用戶容器中使用AccountInformationModule來實現addModule方法('implements AIMModuleContainer ') –

+0

感謝您的幫助。經過反思,在這裏做的正確的事情就是撕掉我所擁有的東西,思考它,然後再正確地做。 :) – delf

0

根據您所提供的代碼,你似乎需要的是一個接口​​應該由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); 
    } 

} 
相關問題