2017-06-22 69 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