我正在尝试实现一个构造函数,就像它在 Ada 2005 中的 Java 或 C++ 中使用的那样。
我在 Java 中有这个类:
public class MyClass {
private static int intTest = 0;
private float floatTest = 0.0f;
private float floatTest2 = 0.0f;
public MyClass(float f_test, float f_test1) {
MyClass.intTest++;
this.floatTest = f_test;
this.floatTest2 = f_test1;
}
}
现在我正尝试在 Ada 2005 中实现它。这就是我所做的,但出现错误。
with Ada.Finalization; use Ada.Finalization;
package MyClasses is
type MyClass (f_test, f_test1 : float)
is new Controlled with private;
type MyClass is access all MyClass'Class;
private
intTest : Integer := 0;
type MyClass( f_test, f_test1: float )
is new Controlled with
record
floatTest : float := f_test;
floatTest2 : float := f_test1;
end record;
overriding procedure Initialize (This : in out MyClass);
end MyClass;
with Ada.Text_IO;
use Ada.Text_IO;
package body MyClasses is
procedure Initialize( This : in out MyClass ) is
begin
intTest := intTest + 1;
end Initialize;
end MyClass;
在这一行我收到错误“判别式必须具有离散或访问类型”。
type MyClass (f_test, f_test1 : float)
is new Controlled with private;
如何像在 java 类中那样实现构造函数?
最佳答案
Float 不是离散类型,“判别式必须具有离散或访问类型”。 Ada 没有您在受 C++ 启发的语言家族中找到的那种构造函数。试图为此重新调整判别式的用途就像试图将螺丝钉钉入墙壁。即使它确实有效,结果仍然不会很好。
相反,您应该有一个返回初始化对象的创建者函数:
type MyClass is new Controlled with private;
function Create(f_test, f_test1 : float) return MyClass;
其他注意事项:
- 您的访问类型 MyClass 与记录类型同名。那行不通。
- 您在 Java 示例中将 intTest 声明为
private static
,但在 Ada 包的私有(private)部分中声明了它。这等同于protected
因为子包可以访问它。相反,在包体中声明它,这实际上等同于private static
。
关于java - Ada 中的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21093539/