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
不包含抽象方法。我建议 GetSize
、SetSize
、Read
、Write
和 Seek
应该真正声明为 abstract
。我怀疑如果 class 今天正在设计,那么它们将被声明为 abstract
并且很可能它们不是出于历史原因。
实例化 TStream
是 Delphi RTL 经验不足的程序员常犯的错误。一旦犯了几次错误,通常就会吸取教训。不幸的是,系统没有提供简单的方法来标记这个错误。每个新程序员都必须努力学习。
我是 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
不包含抽象方法。我建议 GetSize
、SetSize
、Read
、Write
和 Seek
应该真正声明为 abstract
。我怀疑如果 class 今天正在设计,那么它们将被声明为 abstract
并且很可能它们不是出于历史原因。
实例化 TStream
是 Delphi RTL 经验不足的程序员常犯的错误。一旦犯了几次错误,通常就会吸取教训。不幸的是,系统没有提供简单的方法来标记这个错误。每个新程序员都必须努力学习。