Ada: `limited interface` 中 `limited` 的作用是什么

Ada: What is the purpose of `limited` in `limited interface`

几周前我开始学习 Ada。我知道 limited 在某些情况下声明了一个有限类型,不允许复制对象

来自Ada Reference Manual 2012 7.5 1/2

A limited type is (a view of) a type for which copying (such as for an assignment_statement) is not allowed. A nonlimited type is a (view of a) type for which copying is allowed.

但是,由于 interface 类型本质上是抽象的,因此无法创建 'interface object',因此无法复制。关键字 limited 在这里是多余的吗? limited interfaceinterface 有什么区别?

type Abstract_Fruit_Type is interface;
type Abstract_Fruit_Type is limited interface;

我想我明白了: limited interface 可用于扩展 synchronized interface 及其子类别 task interfaceprotected interface,而(非限制)interface 则不能。

-- This is allowed

type Abstract_Type is limited interface;
type Task_Type is task interface and Abstract_Type;
-- This is not allowed
type Abstract_Type is interface;
type Task_Type is task interface and Abstract_Type;
-- error: (Ada 2005) task interface cannot inherit from non-limited interface

task interfaceprotected interface 以及它们的父级 - 所有 synchronized interface 都具有固有的局限性。 Ada Reference Manual 2012 3.9.4 12/2指定以下

A type derived from a nonlimited interface shall be nonlimited.

这意味着

A type that is limited cannot be derived from a nonlimited interface.

事件虽然接口类型本身是抽象的,但它们用于创建具体类型,其对象可以定义。由于上述限制,limited interface中的limited关键字是必需的。

关键区别在于ARM 3.9.4 12/2

A type derived from a nonlimited interface shall be nonlimited.

所以如果你想实现一个有限类型的接口,那么你必须用limited关键字标记接口。然后你就可以实现这个接口了,有限制的或者没有限制的类型。

如果您在接口描述中省略 limited 关键字,那么它的所有实现都将只是非限制类型。

Limited 在 Ada 类型声明中表示“这个东西没有赋值。

在 Ada 的 genericinterface 中,像 limitedprivate 这样的关键字被颠倒了:你是说“这里代表的东西不能假设有 属性 X”。所以你可以用一个整数实例化一个私有类型的泛型参数,但是在泛型本身内部你只能指望来自泛型形式规范的属性。