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
}

問題は、addSection() を呼び出す addModule() でキャストすることです。AIMModuleContainer には AIMModule が含まれているため、addModule() は AIMModule を取得する必要があります。ただし、実装レベルでは、moduleStack ウィジェットが SectionStackSection を挿入するため、インターフェースの「モジュール」を実装に従ってキャストする必要があります。

これは機能しますが、気分が悪いです。誰かが私の AIMModule インターフェイスを SectionStackSection 以外のものを拡張して実装し、その AIMModule を addModule() に渡すと、そのキャストは壊れます。それは正しくないようです。

これは壊れていますか?もしそうなら、それを修正するアプローチは何ですか?

4

2 に答える 2

2

渡された引数が期待する型であることを決してチェックしないため、これは壊れています。ただし、モジュール コンテナーには任意のタイプのモジュールを含めることができるため、これは不可能です。

各モジュール コンテナーは 1 つの型のみを処理しますか? その場合は、ジェネリックを使用してください。そうでない場合、これは全体的に悪い実装であり、常にそうではないものになると想定しています。

于 2012-10-03T02:27:46.373 に答える
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 );
    }

}
于 2012-10-03T11:07:08.533 に答える