我正在尝试实现一个像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类一样实现构造函数?
解决方法:
浮点数不是离散类型,“判别符必须具有离散或访问类型”. Ada没有您在C语言启发的语言家族中找到的那种构造函数.尝试为此重新分配判别器,就像试图将螺丝钉在墙上.如果它确实起作用了,结果仍然不会很漂亮.
相反,您应该具有创建者函数来返回初始化的对象:
type MyClass is new Controlled with private;
function Create(f_test, f_test1 : float) return MyClass;
其他注意事项:
>您的访问类型MyClass与记录类型具有相同的名称.那行不通.
>您在Java示例中将intTest声明为私有静态,但在Ada包的私有部分中声明了它.这等效于受保护,因为子程序包可以访问它.而是在包主体中声明它,这与私有静态等效.