2

虽然高级 Modelica 教程:开发 Modelica 库是从 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' 是可替换的,基类名称必须是可传递不可替换的。

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

参考:

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

  • 第 7.1.4 节Modelica 语言规范 v3.5-dev(“对基类的限制和将类型约束为传递不可替换”)

4

1 回答 1

4

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

不可替换规则打算避免的问题是一组模型,例如:

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 的解决方法是一个很好的解决方案。

于 2020-07-15T07:26:58.410 回答