2017-06-22 68 views

回答

7

德尔福语言并没有真正的抽象类的任何形式概念。

这是事实,你可以定义一个类是抽象:

type 
    TMyClass = class abstract 
    end; 

但是你可以非常清楚实例化这个类。事实上,Delphi中的class abstract是一个只能由被遗弃的Delphi.net编译器使用的功能。

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

当文档中提到TStream为抽象时,它实际上意味着它在概念上是抽象的。事实上,它甚至没有任何方法,所以根据我的定义,它不是抽象的。

我真的不确定为什么TStream不包含抽象方法。我建议GetSize,SetSize,Read,WriteSeek应该真的被宣布为abstract。我怀疑,如果班级今天正在设计,那么他们将被宣布为abstract,并且可能他们不是出于历史原因。

实例化TStream是由Delphi RTL中经验较少的程序员所犯的一个非常常见的错误。一旦犯了几次错误,通常会学到这门课。不幸的是,该系统没有提供简单的方法来解决这个错误。每一个新的程序员都必须学习艰难的方式。

+0

我认为他们不会改变某些方法来抽象,因为可能会有一些(可能是大的和/或旧的)项目实际使用它们的问题 –

+0

@AlbertoMiola *我怀疑如果这个类是今天设计,那么他们会被声明为“抽象的”,并且可能它们并非出于历史原因。* –

+0

@DavidHeffernan如果TStream在概念上是抽象的,那么实例也是概念错误。如果我忘记它并直接使用TStream及其方法(即不是TMemoryStream方法),则代码运行良好。或不? – user3083618