Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
adaoop";“通用”;抽象类型的类型_Oop_Pointers_Generics_Ada_Memory Address - Fatal编程技术网

adaoop";“通用”;抽象类型的类型

adaoop";“通用”;抽象类型的类型,oop,pointers,generics,ada,memory-address,Oop,Pointers,Generics,Ada,Memory Address,我想做的是创建一个类型,其中包括控制代码其他部分传递给它的值。这是菜单系统的一部分,将扩展抽象类型,并且本身是抽象的。我想做的是存储一个访问权限。很简单 type Adjuster is abstract new Menu_Item with record --other fields Value : access Integer; end record; 问题是,我如何使它可以扩展到其他类型?我更喜欢定义整数调整器、浮点调整器等。我有点想使用泛型: generic t

我想做的是创建一个类型,其中包括控制代码其他部分传递给它的值。这是菜单系统的一部分,将扩展抽象类型,并且本身是抽象的。我想做的是存储一个访问权限。很简单

type Adjuster is abstract new Menu_Item with record
    --other fields
    Value : access Integer;
end record;
问题是,我如何使它可以扩展到其他类型?我更喜欢定义整数调整器、浮点调整器等。我有点想使用泛型:

generic
    type T;
    type T_Access is access T;
type Adjuster is abstract new Menu_Item with record
    --other fields
    Value : T_Access;
end record;
但这告诉我,“类型调整器…”行中缺少一个分号,可能是因为Ada/Gnat无法确定该行是在声明一个应该包含在泛型部分中的类型,还是应该应用泛型部分的类型。我认为唯一的方法是制作一个调整器包,并使其通用(但我不希望…)

我还玩弄了存储地址而不是访问的想法,因为Ada不在乎它是什么类型的地址:

type Adjuster is abstract new Menu_Item with record
    --other fields
    Value : System.Address
end record;
但首先,我对地址的了解不够,无法确定这是否有效或如何有效(您是否将其分配给Value.all.?),其次,能够存储一个[耸肩]真的感觉像是Ada设计时无法做到的事情


我有点没主意了。任何帮助都将不胜感激。

您可能会得到您想要的,通过使您想要扩展的类型
标记
您可能会得到您想要的,通过使您想要扩展的类型
标记

Ada不提供泛型类型。包是Ada的封装单元,而不是类型。尝试创建一个通用包。@JimRogers感谢您的评论。它不一定需要是泛型类型,甚至根本不需要使用泛型。如果有其他方法可以设置该类型,以便它可以引用不同类型的数据,我不希望为该类型创建专用包。泛型参数只能传递给泛型单位。您可以尝试在一个包中创建一个标记类型作为继承树的根,并提供一个泛型包来扩展该类型及其关联方法。基本包应该包含一个或多个调度程序或函数。考虑重新检查这种心态。你是否同样不愿在java或C++中声明一个类?包可以非常轻量级,它们不需要向项目中添加一对文件。如果合适的话,甚至可以将它们声明为单个过程的本地,也就是说,如果不需要在其他地方公开它们的话。正如Jim所说,它们是封装单元。因此,一个通用类型的包公开一种类型及其方法是一个合适的解决方案。@ JimRokes,我想本质上是声明一个类型的int,浮点等。布瑞恩提出了一个好点,关于java和C++的类。谢谢,我想我会围绕它做一个包。Ada不提供泛型类型。包是Ada的封装单元,而不是类型。尝试创建一个通用包。@JimRogers感谢您的评论。它不一定需要是泛型类型,甚至根本不需要使用泛型。如果有其他方法可以设置该类型,以便它可以引用不同类型的数据,我不希望为该类型创建专用包。泛型参数只能传递给泛型单位。您可以尝试在一个包中创建一个标记类型作为继承树的根,并提供一个泛型包来扩展该类型及其关联方法。基本包应该包含一个或多个调度程序或函数。考虑重新检查这种心态。你是否同样不愿在java或C++中声明一个类?包可以非常轻量级,它们不需要向项目中添加一对文件。如果合适的话,甚至可以将它们声明为单个过程的本地,也就是说,如果不需要在其他地方公开它们的话。正如Jim所说,它们是封装单元。因此,一个通用类型的包公开一种类型及其方法是一个合适的解决方案。@ JimRokes,我想本质上是声明一个类型的int,浮点等。布瑞恩提出了一个好点,关于java和C++的类。谢谢,我想我会在它周围包一个包。接得好。我没有注意到基类型没有声明为标记的。很好。我没有注意到基类型没有声明为标记。