在这种情况下,我想实施建议服务。假定这是一项服务,用户可以调用该服务来检索某些已定义字段的建议值。假设我想要有关汽车和手机的建议。这些字段是固定的,因此我可以在服务的界面中为每个字段硬编码一个方法。
但是,实际服务的实现应该可以自由确定它如何检索这些建议。它可能会查看文件,也可能会调用Web服务。为此,它还应该能够确定检索这些建议所需的参数。一些实现可能需要更多信息,而某些实现可能需要更少的信息。返回的结果相同:某些实现可能返回一个值,其他实现可能返回多个。
我想在服务的界面中反映出来,所以我这样写:
public interface SuggestionService {
SuggestionResult getcarSuggestion(final SuggestionCriteria criteria);
SuggestionResult getMobilephonesuggestion(final SuggestionCriteria criteria);
}
SuggestionResult
和SuggestionCriteria
都是接口。 SuggestionService
的实现可以使用它们自己的这两个接口的实现来正确提供功能。这对于返回类型非常有效,因为我可以在方法实现中缩小它们的范围:
public class SuggestionServiceImpl implements SuggestionService {
public CarSuggestionResult getcarSuggestion(final SuggestionCriteria criteria) {...}
public MobilephonesuggestionResult getMobilephonesuggestion(final SuggestionCriteria criteria) {...}
}
问题是我无法更改参数类型。如果我在SuggestionServiceImpl
public CarSuggestionResult getcarSuggestion(final CarSuggestionCriteria criteria) {...}
然后我得到一个编译错误。这是有道理的,因为我现在通过减少允许的参数类型的数量来缩小了我试图实现的接口。出于充分的原因,这是不允许的。
但是,我觉得SuggestionServiceImpl
应该能够告诉用户它实际上需要什么参数-通过在方法签名中指定它们。这里有一个奇怪的利益冲突,我无法提出解决方案。一方面,我想编写和使用实际实现需要实现的接口。这样,我可以确保所有实现都提供用于检索我感兴趣的字段的方法-在这种情况下为汽车和手机。但是,实现接口应该能够准确地告诉用户它需要哪种类型的参数,并且不接受任何通用的参数列表,而是将其传递给用户以传递正确的参数。有什么办法可以将这两个愿望结合起来?