Delphi tstream:创建时的奇怪行为

Delphi tstream: strange behaviour on create

我是 Delphi 的新手。在 TStrem class 的文档中,我读到它是一个摘要 class。 所以我认为当我尝试用

创建它时编译器出错了
stream := TStream.Create();

为什么不呢?

Delphi 语言实际上没有任何正式的抽象概念 class。

确实可以定义一个class是抽象的:

type
  TMyClass = class abstract
  end;

但是你可以很好地实例化这个class。事实上 Delphi 中的 class abstract 是一个仅被长期废弃的 Delphi .net 编译器使用的特性。

一个更有用的抽象定义 class 是包含 abstract 方法的定义。如果您尝试实例化这样的 class,则会发出编译器警告。如果您愿意,可以通过编译器选项将这些警告升级为错误。

当文档将 TStream 称为抽象时,它实际上意味着它是 "conceptually" 抽象。事实上它甚至没有任何 abstract 方法,所以根据我上面的定义它不是抽象的。

我真的不知道为什么 TStream 不包含抽象方法。我建议 GetSizeSetSizeReadWriteSeek 应该真正声明为 abstract。我怀疑如果 class 今天正在设计,那么它们将被声明为 abstract 并且很可能它们不是出于历史原因。

实例化 TStream 是 Delphi RTL 经验不足的程序员常犯的错误。一旦犯了几次错误,通常就会吸取教训。不幸的是,系统没有提供简单的方法来标记这个错误。每个新程序员都必须努力学习。