在 guidewire 中的实体上使用 implementsInterface 元素

Usage of implementsInterface element on entities in guidewire

我想知道为什么我们在实体中使用 implementsInterface 元素。我知道一个例子,他们用它来使它成为可分配的实体。但我不明白还有什么其他目的,how/why 它在实体中被使用。

示例:伤害事件实体具有索赔人供应商和保险供应商接口

我喜欢从这个角度来看它,简化并假设您有一些 java 背景:

正如您可能已经知道的那样,拥有一个实体最终意味着拥有一个 Java class... 那么,通过在您的实体中使用 implementsInterface 元素,是类似于在你 java class.

中实现一个接口

这里有一个简单的例子...

考虑以下几点:

MyEntiti.eti

<?xml version="1.0"?>
<entity
  xmlns="http://guidewire.com/datamodel"
  entity="MyEntity"
  table="myentity"
  type="retireable"/>

AnInterface.gs

package mypkg
interface AnInterface {
  function doSomething()
}

AnInterfaceImpl.gs

package mypkg

class AnInterfaceImpl implements AnInterface {
  override function doSomething() {
    print("Hello!")
  }
}

需要MyEntity具备"doSomething"能力的图片,只需添加implementsInterface:

<?xml version="1.0"?>
<entity
  xmlns="http://guidewire.com/datamodel"
  entity="MyEntity"
  table="myentity"
  type="retireable">
  <implementsInterface
    iface="mypkg.AnInterface"
    impl="mypkg.AnInterfaceImpl"/>
</entity>

通过这样做,以下代码必须有效:

var myEntity = new MyEntity()
myEntity.doSomething() //this will call the  method defined in the interface-implementation

更好的是,您可能会让您实现识别 MyEntity 的相关对象并根据您的需要使用它:

package mypkg

class AnInterfaceImpl implements AnInterface {
  
  private final var  _relatedEntity : MyEntity

  construct(relatedTo : MyEntity) {
    _relatedEntity = relatedTo 
  }

  override function doSomething() {
    var createUser = _relatedEntity.CreateUser // you can accees to whatever you need
    print("Hello!, this is the related instace of MyEntity: ${_relatedEntity}")
  }
}

希望对您有所帮助,问候!

我不会重复描述它如何工作的其他答案,但我想提一下与使用增强功能相比,在实体上实现接口有何不同(并且服务于不同的目的)。

在基本层面上,这两种方法都可以让您向实体 classes 添加额外的功能。在大多数情况下,你真正想做的只是 create/expand 一个增强 - 它们更容易编写,更方便修改,并且当你只想添加一个新函数或计算时同样有效 属性.

当你实现一个接口时,你会带来一些更严肃的枪支。虽然这种方法需要更多的工作并且需要创建多个文件(更不用说修改实体本身),但它比增强机制有两个重要的优势:

  1. 同一个接口可以由多个实体(通常每个实体都有自己的实现 class)以及 non-entity classes 实现。所有这些 classes 的对象然后可以在期望接口的上下文中互换使用(您可以创建多个实体的实体实例数组甚至 gosu-only wrappers/temporary 对象并将其舒适地呈现在UI).

  2. 您可以利用多态性。虽然不能覆盖增强功能,但接口实现允许您充分灵活地使用多态 OOP。例如,您可以在您打算使用的高级实体上设置一个默认的“什么都不做”实现,然后为特定子类型添加更有意义的实现,以真正利用新功能。

然而,它确实有一些开销并使事情复杂化。如前所述 - 增强功能通常更简单。在实践中,您应该问问自己,创建和实现接口的额外努力是否值得 - 在许多情况下,即使看似需要多态性的情况也可以通过增强中的简单 switch typeof this 来处理得足够好,以提供所有必要的type-based逻辑。

根据个人经验,我在很多情况下都使用过接口,但在绝大多数情况下,增强功能是我的首选。

作为最后的说明,我想提一下委托实体。如果您想要添加到一些不相关实体的不是功能而是具有基础数据库字段的属性,请创建一个委托实体并使用所需的独立实体“实现”它。委托实体的工作方式确实有点像接口(在需要委托的情况下,您可以交替使用实现委托的实体对象),并且您还可以 set-up 接口实现和委托级别的增强。