我的分配需要创建一个包装的软件包,该软件包创建一个异质(使用继承(双链接列表。将节点插入列表很简单,但是当我必须找到一个包含某些信息的节点时,我的问题出现了。
PACKAGE AbstList IS
TYPE AbstractList IS LIMITED PRIVATE;
TYPE Node IS TAGGED PRIVATE;
TYPE NodePtr IS ACCESS ALL Node'Class;
PROCEDURE Init_Head(List: ACCESS AbstractList);
PROCEDURE InsertFront(List: ACCESS AbstractList; Item: IN NodePtr; Success: OUT Boolean);
PROCEDURE InsertRear(List: ACCESS AbstractList; Item: IN NodePtr; Success: OUT Boolean);
FUNCTION ListSize(List: ACCESS AbstractList) RETURN Integer;
-- The following are commented out as they are not complete in the package body
--FUNCTION FindItem(List: ACCESS AbstractList; Value: NodePtr) RETURN NodePtr;
--PROCEDURE Delete(List: ACCESS AbstractList; Item: NodePtr);
--PROCEDURE Print(List: ACCESS AbstractList);
PRIVATE
TYPE Node IS TAGGED RECORD
Rlink, Llink: NodePtr;
END RECORD;
TYPE AbstractList IS LIMITED RECORD
Count: Integer := 0;
Head: NodePtr := NEW Node;
END RECORD;
END AbstList;
我用来插入列表中的这样的记录是:
TYPE CarName IS (GMC, Chevy, Ford, RAM);
TYPE Car IS NEW AbstList.Node WITH RECORD
NumDoors: Integer;
Manufacturer: CarName := GMC; -- Default manu.
END RECORD;
所以,例如,我如何在列表中找到包含指定的"制造商"的节点?有人建议我超载" ="操作员,尽管我不确定在拥有的东西的情况下这将如何工作。任何建议,将不胜感激。
根据手臂,相等性操作员是针对您的节点类型的非限制类型的预定剂。
如果您想要与默认值不同的行为(记录的所有成员的平等,请覆盖它。函数规范在同一页面中,只需使用您的 t 带有 node type(在这种情况下为 car (,然后写下您想要的
ADA 95理性第2部分第4章在4.3类宽类型和操作中说
预定义的平等运算符和成员资格测试被推广到全班类型。像其他预定义的操作一样,实现将取决于操作数的特定特定类型。但是,与正常的调度操作不同,如果操作数的标签不匹配,则不会提高约束。
对于平等,标签不匹配被视为不平等。只有标签匹配是调度,然后对特定于类型的相等性检查操作执行。这种方法允许程序可以安全地比较一个范围标记的类型的两个值,而无需先检查其标签是否匹配。如[rm83 4.5.2(12(]所述,这种平等检查中没有例外的事实与其他预定义的关系运算符一致。
因此,您希望能够说例如FindItem
Current : Nodeptr := List.Head.Rlink;
begin
...
if Value.all = Current.all then
-- we’ve found a match
但是Car
的预定义平等也包括Node
组件Llink
,Rlink
。
所需的是一个平等操作,它仅比较Car
组件。
您可以通过说
来覆盖预定义的平等type Node is abstract tagged private;
function "=" (L, R : Node) return Boolean is abstract;
,然后
type Car is new Abstlist.Node with record
Numdoors: Integer;
Manufacturer: Carname := Gmc;
end record;
overriding
function "=" (L, R : Car) return Boolean is
(L.Manufacturer = R.Manufacturer and then L.Numdoors = R.Numdoors);
(这是ADA 2012语法(。