【问题标题】:How to have a causal connector with a replaceable type?如何拥有可更换类型的因果连接器?
【发布时间】:2020-07-14 15:42:08
【问题描述】:

虽然 Advanced Modelica Tutorial: Developing Modelica Libraries 来自 2003 年,但我仍然相信第 29 页中的代码会给出因果关系 connector (RealPort) 和 replaceable type

connector RealPort
  replaceable type SignalType = Real;
  extends SignalType;
end RealPort;

虽然此代码在 Wolfram SystemModeler 的当前版本中有效,但 Open Modelica v1.16.0-dev.03 (64-bit) 抱怨,并给出以下错误:

“extends SignalType”中的“SignalType”类是可替换的,基类名称必须是不可替换的。

那么,关于传递性不可替换性,谁是正确的?如何正确地做到这一点?

参考资料:

  • Section 6.2.1Modelica 语言规范 v3.5-dev ("Transitive non-Replaceable")

  • Section 7.1.4 Modelica Language Specification v3.5-dev(“对基类的限制和将类型约束为传递不可替换”)

【问题讨论】:

  • OpenModelica 是肯定的。这在以前的 Modelica 规范中是允许的,但现在不再允许了。带有 Pedantic Mode 的 Dymola 也抱怨:“检查 RealPort:基类 SignalType 是可替换的”。如果没有 Pedantic Mode,Dymola 允许这样做并发出警告。
  • 您可以使用短类定义而不是扩展:可替换类型 SignalType = Real;连接器 RealPort = SignalType;这应该可以正常工作。

标签: modelica openmodelica systemmodeler


【解决方案1】:

上面的类不是传递不可替换的,因此翻译应该失败。

不可替换规则要避免的问题是一组模型如:

connector RealPort
  replaceable type SignalType = Real;
  extends SignalType;
end RealPort;

type MySignal
  type SignalType=Integer;
  extends Real(...);
end MySignal;

connector MyPort=RealPort(redeclare type SignalType=MySignal);

这些类的问题在于 MyPort 中的 SignalType 似乎同时是两件事,并且不清楚问题是从哪里引入的,因为重新声明似乎与约束类一致,并且原始类看起来没问题。

(传递性只是意味着您可以使用中间不可替换的类来混淆事物。)

Adrian Pop 的变通方案是一个很好的解决方案。

【讨论】:

  • 好的,但是为什么像 Dymola 和 SystemModeler 这样的工具会“诱使”我相信我可以避免违反规范? (SystemModeler 从不发出警告)因此代码对于非专有工具的可移植性降低了? ;-)
  • Dymola 总是给出一条消息,指出它是错误的。 (至少在我测试的版本中。)但是,通常这是一个警告,因为存在使用它的旧模型,并且在引入新规则时打破旧模型也会破坏可移植性。
猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
相关资源
最近更新 更多