在 lsFusion 3.0 中,很容易创建抽象动作并添加单参数实现。例如像这样:
CLASS TrafficLight {
red 'Red',
yellow 'Yellow',
green 'Green'
}
crossroads ABSTRACT CASE (TrafficLight);
crossroads(TrafficLight t) + WHEN t = TrafficLight.red THEN {MESSAGE 'Stop - ' + staticCaption(t);}
但是,值得再添加一个参数,服务器会停止启动。下面的示例不再起作用
CLASS TrafficLight {
red 'Red',
yellow 'Yellow',
green 'Green'
}
CLASS Vehicle {
truck 'Truck',
car 'Car'
}
crossroads ABSTRACT CASE (TrafficLight, Vehicle);
crossroads(TrafficLight t, Vehicle v) + WHEN t = TrafficLight.red THEN {MESSAGE 'Stop ' + staticCaption(v);}
到目前为止,作为一种解决方法,我在添加的实现中使用了 ABSTRACT LIST 和 IF...THEN,但是我如何在没有拐杖的情况下做到这一点?
简而言之,您需要在 WHEN 中添加 v IS Vehicle:
较长的解释如下。关键是 lsFusion 大体上不是一种强类型语言。也就是说,设置参数类只是帮助查找属性,这样每次你不指定它们的签名时,这些类就不会以任何方式参与计算逻辑。因此,在您的情况下,添加实现相当于:
因此,平台不能(也不应该)从实现中推断出类,因此会给出错误:
如果您这样做,可能会出现类似的问题:
另一件事是,是的,这并不总是显而易见的,并且在平台的未来版本中,显式类型很可能会自动添加 IF a IS A,也就是说,上面的示例将等同于:
此外,已经朝着这个方向迈出了第一步。当使用不带 WHEN 的 ABSTRACT 时,已经出现了类条件的隐式添加,即: