我是Delphi的新手。在TStrem类的文档中,我读到它是一个抽象类。 所以我觉得编译器进入错误,当我尝试用Delphi tstream:创建奇怪的行为
stream := TStream.Create();
为什么不创建呢?
我是Delphi的新手。在TStrem类的文档中,我读到它是一个抽象类。 所以我觉得编译器进入错误,当我尝试用Delphi tstream:创建奇怪的行为
stream := TStream.Create();
为什么不创建呢?
德尔福语言并没有真正的抽象类的任何形式概念。
这是事实,你可以定义一个类是抽象:
type
TMyClass = class abstract
end;
但是你可以非常清楚实例化这个类。事实上,Delphi中的class abstract
是一个只能由被遗弃的Delphi.net编译器使用的功能。
抽象类的更有用的定义是包含abstract
方法的定义。如果您尝试实例化这样的类,那么会发出编译器警告。如果您愿意,可以通过编译器选项将这些警告提升为错误。
当文档中提到TStream
为抽象时,它实际上意味着它在概念上是抽象的。事实上,它甚至没有任何方法,所以根据我的定义,它不是抽象的。
我真的不确定为什么TStream
不包含抽象方法。我建议GetSize
,SetSize
,Read
,Write
和Seek
应该真的被宣布为abstract
。我怀疑,如果班级今天正在设计,那么他们将被宣布为abstract
,并且可能他们不是出于历史原因。
实例化TStream
是由Delphi RTL中经验较少的程序员所犯的一个非常常见的错误。一旦犯了几次错误,通常会学到这门课。不幸的是,该系统没有提供简单的方法来解决这个错误。每一个新的程序员都必须学习艰难的方式。
我认为他们不会改变某些方法来抽象,因为可能会有一些(可能是大的和/或旧的)项目实际使用它们的问题 –
@AlbertoMiola *我怀疑如果这个类是今天设计,那么他们会被声明为“抽象的”,并且可能它们并非出于历史原因。* –
@DavidHeffernan如果TStream在概念上是抽象的,那么实例也是概念错误。如果我忘记它并直接使用TStream及其方法(即不是TMemoryStream方法),则代码运行良好。或不? – user3083618