2017-06-22 16 views

答えて

7

Delphi言語には抽象クラスの正式な概念はありません。

あなたが抽象するクラスを定義することができるというのは本当です:

type 
    TMyClass = class abstract 
    end; 

しかし、あなたは完全によく、このクラスをインスタンス化することができます。実際には、Delphiのclass abstractは、Delphi .netコンパイラが放棄したばかりの機能でしか使用されない機能です。

抽象クラスのより有効な定義は、abstractメソッドを含むものです。このようなクラスをインスタンス化しようとすると、コンパイラの警告が出されます。これらの警告は、必要に応じて、コンパイラオプションを使用してエラーに昇格させることができます。

ドキュメントでは、TStreamが抽象的であると記載されている場合、それは実際には「概念的に」抽象的であることを意味します。実際にはそれにはabstractメソッドがないので、上の私の定義では抽象的ではありません。

なぜTStreamに抽象メソッドが含まれていないのかわかりません。 GetSizeSetSizeReadWriteSeekは、実際にはabstractと宣言する必要があります。私はクラスが今日設計されていれば、abstractと宣言され、歴史的な理由ではないと思われます。

TStreamをインスタンシエートすることは、Delphi RTLであまり経験の浅いプログラマが行うよくある間違いです。間違いが数回行われると、レッスンは通常学習されます。残念なことに、このシステムには、このミスを簡単に報告する方法はありません。それぞれの新しいプログラマーはそれぞれ難しい方法を学ばなければなりません。

+0

実際にそれらを使用しているプロジェクト(おそらく大きいプロジェクトや古いプロジェクト)に問題がある可能性があるため、抽象化する方法が変わっていないと思います。 –

+0

@AlbertoMiola *クラスが今日設計されていれば、 'abstract'と宣言され、歴史的な理由からそうではない可能性があります。* –

+0

@DavidHeffernan TStreamが抽象的に概念的に存在する場合、インスタンスは概念上のエラーです。私がそれを忘れてTStreamとそのメソッドを直接使用すると(つまり、TMemoryStreamメソッドではなく)、コードはうまく動作します。か否か? – user3083618

関連する問題