8

Delphi中的析构函数通常被命名为“Destroy”,但据我所知,你也可以

  • 以不同的方式命名析构函数
  • 有多个析构函数

这样做有什么理由吗?不同命名/多个析构函数的可能用例是什么?

4

1 回答 1

8

理论上你可以手动调用不同的析构函数来释放不同的外部资源,比如打破引用计数循环、删除或关闭文件等。

此外,由于 Object Pascal 语言没有那些神奇的 new/delete 操作,所以应该有一些标识符来调用对象的处置。

我更愿意回顾一下。

“Turbo Pascal with Objects”风格的对象两者都有——你调用一个“神奇的”Dispose过程,但明确指定一个要调用的析构函数,因为语言本身不知道该选择什么。同样,“魔术”程序New必须提供手动选择的构造函数。

然而,这违反了 DRY 原则:编译器知道我们正在调用 d-tor 或 c-tor,但我们必须另外调用那些“New”和“Dispose”函数。从理论上讲,这可能提供了将内存分配和信息馈送分离并以我们想要的方式组合它们的方式。但我不认为这个功能实际上被广泛使用。

有趣的是,Apple Objective C 中使用了相同的设计。您首先为对象分配内存,然后为该新实例调用构造函数:http ://en.wikipedia.org/wiki/Objective-C#Instantiation

当该模型为 Delphi 简化时,几乎没有做出让事情更简化(和统一)的决定。内存 [de] 分配策略已转移到类级别,而不是调用站点。这使得调用“New”和命名构造函数的冗余非常对比。一个必须被丢弃。

C++/C#/Java 选择为它保留一个特殊的语言级关键字,使用重载函数来提供不同的 c-tors。也许这对应于美国风格的计算机语言。

然而,Pascal 的核心有两个想法:冗长和小词汇量。可以说它们可以用其他欧洲学校的语言(如 Scala)进行跟踪。如果可能,应将关键字从语言本身中删除并移至外部模块 - 您可以从项目中添加或删除的库。重载函数是在很晚才引入到语言中的,早期的偏好是肯定有两个不同命名的(自文档化)函数名。

这两种想法可能导致 Delphi 删除“魔术”过程并仅通过使用的函数名称来推断调用站点的对象创建/销毁。如果您调用MyVar.Destroy,那么编译器会查看声明.Destroy并知道我们正在删除该对象。TMyType.CreateXXX(YYY,ZZZ)同样,由于声明的方式,它知道是一个对象实例化CreateXXX

为了使 c-tor 和 d-tor 像 C++ 中一样无名,Delphi 必须在语言级别引入另外两个关键字,例如 C++newdelete. 这似乎没有明显的优势。至少我个人更喜欢德尔福的方式。

PS。我必须添加一个假设:我们谈论的是真正的 C++ 和 Delphi 语言,因为它们是在 1995 年左右。它们仅具有堆分配对象的手动内存控制,没有垃圾收集和自动引用计数。您无法通过使用 nil/NULL 指针分配变量来触发对象销毁。

于 2013-11-12T11:25:55.650 回答