我有以下 - 简单 - 问题:用于表示度数的增量类型及其子类型,角度,我将范围限制为 0.0 .. <360.0。
现在,我想覆盖子类型的“+”运算符以拥有我自己的模运算符:
package ...
type Degree is digits Degree_Digits;
end package
package ...
subtype Limited_Angle is Degree range Degree_Min .. Degree_Max;
function "+" (Left, Right : in Limited_Angle) return Limited_Angle;
end package
和实现:
function "+" (Left, Right : in Limited_Angle) return Limited_Angle is
res : Degree;
begin
res := Units.Base.Degrees."+"(Left, Right);
...
return Limited_Angle(res);
end "+";
但我不喜欢这种方式,+-运算符被调用。我的第一个想法是有类似的东西
res := Degree(Left) + Degree(Right);
但这不起作用。我的编译器警告无限递归。
甚至更严格:
res := (Degree(Left)) + (Degree(Right));
是关于无限递归的警告。我不明白这背后的原理。 T(S) 不应该将 S 转换为 T 吗?它不可能是优化问题,因为 (T(S)) 也不起作用。
我是否错过了类型-子类型转换的概念(最有可能)并且有人有解决方案/解释吗?或者甚至更好的解决方案?
谢谢!
最佳答案
您的问题与类型转换无关,而是与理解类型和子类型之间的区别有关。
一个类型的所有子类型都具有完全相同的操作。类型的子类型(包括类型本身,从技术上讲是“类型的第一个子类型”)之间的差异只是允许值的集合。
这意味着您在 Degrees
之间的所有转换和 Limited_Degrees
不要做太多,你的电话是Units.Base.Degrees."+" (Left, Right)
实际上是一个递归调用。
我认为解决您的问题的方法是使 Limited_Degrees
派生类型,而不是子类型。
关于types - Ada:子类型转换或调用“Base”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51885295/