繁体   English   中英

定义Web服务接口(继承/重载)的最佳/标准方法是什么?

[英]What is the best/standard way to define a web service interface (inheritance/overloading)?

定义Web服务接口的最佳/标准方法是什么?

例如,

我有两个班级的汽车和公共汽车,它们都扩展了车辆。

如果要公开Car和Bus的create方法,则可以使用以下选项-

  1. public void create(车辆v);
  2. public void create(String type,Vehicle v);
  3. public void create(Car c); 和public void create(Bus b);
  4. 公共无效createCar(Vehicle v); 和public void createBus(Vehicle v);
  5. 公共无效createCar(Car c); 和public void createBus(Bus b);

编辑 - - - - - - - - - - - - - - - - -

我主要关心的是以上5个选项,这是Web服务API的标准方式。 Java编码的标准可能不是Web服务的标准。

第一个似乎是您可以使用的最通用的,您只需在CarBus类中覆盖它即可

如果您对标准方式感兴趣,那么这些都不是。
Web服务不支持操作重载,并且在WS BP Profile中被禁止
WS BP

4.5.3 Distinctive Operations

Operation name overloading in a wsdl:portType is disallowed by the Profile. 

这实际上是有道理的,因为消息模式(doc / lit)期望将操作名称作为消息有效负载的根进行分配。
另外,您在谈论的是OO概念,但Web服务标准是一种集成技术(不绑定到特定的语言或平台)。
在任何情况下,如果您希望这样做,都可以通过在注释中进行tweeking来实现重载,并且在您的情况下,恕我直言,我认为最好的选择是2以便消费者知道如何向下转换。

首先,您的方法称为create ,因此按惯例应该是一种工厂方法,因此应返回 Vehicle的实例。 您的方法看起来更像init因为它们接收了Vehicle,Car,Bus的实例。

因此,我建议您修改签名,例如

Vehicle create(*some arguments*)

现在介绍re型。 我建议您使用基于泛型的定义,例如

<V extends Vehicle> V create()

可以在不强制转换为特定Vehicle子类的情况下调用此方法。

关于争论。 我相信你可以使用

  1. 字符串类型(根据您的建议)
  2. 班级类型
  3. 定义特殊的枚举车辆{Car,Bus,Bike}并使用它。

另外,您也可以(按照您的建议)为每种类型的Vehicle创建多个工厂方法,例如createCarcreateBus但我不喜欢这种方法,因为每次添加新的Vehicle类型时,都必须添加这种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM