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

当您实现一个接口时,编译器会确保您的实现与声明相符,即您不能将参数类型缩小到派生类。

但是,您可以传入派生类:

   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 回答
0

好吧,如果您将接口声明为接受BaseRequestjava 的接口,不会让您将其范围缩小到 some SpecificRequest,这些是 OOP 的基础。如果你真的需要这个接口,你应该向我们展示你将要创建的接口的其他实现示例。我的意思是很难看出你的设计的意义在于你是否做得太多。

于 2012-08-16T18:59:31.460 回答