Abstract class 如何在Ada中取消对抽象类的分配?

Abstract class 如何在Ada中取消对抽象类的分配?,abstract-class,dynamic-memory-allocation,ada,Abstract Class,Dynamic Memory Allocation,Ada,我非常了解Ada,但我仍然在努力解决OO的问题,尤其是在Ada中。因此,很可能我只是漏掉了一点 考虑一个类似于树的数据结构。树中存储的对象是抽象类型的。我希望完全控制释放(使用Ada.Finalization),因为我使用安全指针实现数据结构。这意味着在解除分配树时,当仍然存在对它的引用时,不能解除分配子树 在这种情况下,需要取消分配数据结构中引用的具体对象。在我看来,这需要一个抽象的释放。有没有一个简单的方法可以做到这一点?我还考虑声明一个无抽象的子例程,该子例程必须由抽象类型的实例实现。不成

我非常了解Ada,但我仍然在努力解决OO的问题,尤其是在Ada中。因此,很可能我只是漏掉了一点

考虑一个类似于树的数据结构。树中存储的对象是抽象类型的。我希望完全控制释放(使用Ada.Finalization),因为我使用安全指针实现数据结构。这意味着在解除分配树时,当仍然存在对它的引用时,不能解除分配子树

在这种情况下,需要取消分配数据结构中引用的具体对象。在我看来,这需要一个抽象的释放。有没有一个简单的方法可以做到这一点?我还考虑声明一个无抽象的子例程,该子例程必须由抽象类型的实例实现。不成功


在中,我们还没有检查标准库是否有合适的数据结构。目前我只是对这个问题本身感到好奇。

这是一个下雨的星期天早上的娱乐节目

基本技巧是对要释放的类型使用
Foo'Class
,对访问类型使用
access Foo'Class

通用
类型T是抽象标记的私有类型;
类型T_Access是Access T'CLass;
包抽象\u解除分配是
持字人为私人;
函数为_空(H:Holder)返回布尔值;
程序添加(至:输入输出持有人;项目:T_访问);
程序释放(H:输入输出保持架)
使用Post=>时为_空(H);
私有的
类型保持架是新的T_通道;
函数为空(H:Holder)返回布尔值
is(H=null);
取消分配;
与Ada.Unchecked\u解除分配;
包体抽象\u解除分配为
无过程是新的Ada.U释放
(T’Class,T_访问);
程序添加(到:输入输出支架;项目:T_访问)为
开始
至:=持有人(项目);
结束添加;
程序释放(H:输入输出保持架)为
开始
免费(T_访问(H));
末端释放;
取消分配;
具有抽象\u释放功能;
程序摘要\u解除分配\u测试
类型实际\u T为抽象标记的空记录;
类型实际访问是访问所有实际访问类;
包演示是一个新的抽象\u释放
(T=>实际值,
T_访问=>实际访问);
类型Concrete\u T是带有空记录的新实际\u T;
持有者:Demo.Holder;
开始
添加演示(支架、新混凝土);
演示发布(持有者);
结束抽象分配测试;

在几十年的阅读comp.lang.ada新闻组的过程中,我发现ada最常导致问题的功能是匿名访问对象类型和按类型扩展编程。我的结论是,如果没有这些特性,语言会更好,并且避免使用它们。对使用类型扩展和不使用类型扩展实现的相同设计的任何比较都表明,使用类型扩展的版本更短,但更难理解。类型扩展总是违反S/W工程的局部性原则。因此,称职的软件工程师不使用类型扩展。在某些领域,如流或用户界面,没有类型扩展,你就无法进入任何地方。实际上,如果你想避免编程中的任何问题,你最好完全避免编程。那么你就安全了……事后看来,我认为对于
Add
,我要么使用
Holder
为空的先决条件,要么
Release
任何现有内容。