3

ラップされたオブジェクトDataContainerがクライアントに渡されることを考慮してください

// Will be handed out
public interface DataContainer 

それを使用するために、クライアントは現在、オブジェクトを次のようにキャストすることを知る必要があります。

public interface ConcreteObject_1_Container extends DataContainer
public interface ConcreteObject_2_Container extends DataContainer

オプションを選択する方法と同様に、 と の両方を選択可能なオプションとして提供することは可能ConcreteObject1Containerですか?ConcreteObject2ContainerEnum

ユーザーが魔法のように使用することを知っている代わりにFileContainer

                                   // user knows
FileContainer   fileContainer   = (FileContainer) 
                ContainerFactory.getContainerFor(DataSource.FILE, 
                                                 TREAT_AS_SOURCE);

そうしたいです。

                                  // user selects
FileContainer   fileContainer   = (GenericContainer.FileContainer) 
                ContainerFactory.getContainerFor(DataSource.FILE, 
                                                 TREAT_AS_SOURCE); 
4

2 に答える 2

6

おそらくデザインを変更する必要があります。また:

  1. クライアントDataContainerは、実装が何であるかを気にせずに、のメソッドを使用するだけです。この場合、キャストを回避できます。または
  2. クライアントは実際には実装に結合されているため、実装タイプを直接使用する必要があります (たとえば、2 つの異なるメソッドを使用)。
于 2012-06-06T14:02:51.540 に答える
0

getConatainerForをジェネリックメソッドにできる場合は、型推論を使用して特定の型を返すことができます。

于 2012-06-06T13:53:18.043 に答える