1

インターフェイスの関数の引数タイプとして、リクエストの基本実装を作成しようとしています。

次に、さまざまなクラスに基本リクエストクラスを拡張させて、リクエストオブジェクトにより具体的な意味を与えます。

ただし、Javaは引数として正確なクラスを必要とし、その基本クラスによって拡張されたクラスを尊重しません。

public interface MyInterface{
   public String getValue(BaseRequest req);
}

public class MyInterfaceImpl implements MyInterface{
   public String getValue(SpecificRequest req){ //Java will give a compile error here.
      //Impl
   }
}

public interface BaseRequest{
   int requiredA;
   int requiredB;
   //setter and getters for A and B
}

public class SpecificRequest extends BaseRequest{
   int specificValC;
   //setter and getters for C
}

このパターンを達成するための最良の方法は何ですか?それとも私は少しデザインしすぎていますか?

4

3 に答える 3

10

ジェネリックを使用して同様のことを達成できます。

public interface MyInterface<R extends BaseRequest> {
   public String getValue(R req);
}

public class MyInterfaceImpl implements MyInterface<SpecificRequest> {
   public String getValue(SpecificRequest req){ 
      //Impl
   }
}
于 2012-08-16T19:01:05.627 に答える
0

さて、Javaを受け入れるものとしてインターフェースを宣言しているのであれば、BaseRequestそれをいくつかに絞り込むことはできませんSpecificRequest。これらがOOPの基本です。このインターフェースが本当に必要な場合は、作成するインターフェースの他の実装の例を示してください。私はあなたがそれをやりすぎているかどうかを見分けるためにあなたのデザインのポイントを見るのは難しいことを意味します。

于 2012-08-16T18:59:31.460 に答える
0

インターフェイスを実装するとき、コンパイラは実装が宣言に忠実であることを確認します。つまり、パラメータタイプを派生クラスに絞り込むことはできません。

ただし、派生クラスを渡すことはできます。

   public class MyInterfaceImpl implements MyInterface {
       public String getValue(BaseRequest req){ 
           // ...
       }
   }

   ... 
   // calling your method
   MyInterface provider = ...
   SpecificRequest request = ...
   provider.getValue(request); 
于 2012-08-16T19:09:58.680 に答える