私はDelphiの新機能です。 TStremクラスのドキュメントでは、抽象クラスであると読んでいます。 ので、私はDelphi tstream:作成時に奇妙な動作が発生する
stream := TStream.Create();
なぜないでそれを作成しようとすると、コンパイラはエラーに行くと思いますか?
私はDelphiの新機能です。 TStremクラスのドキュメントでは、抽象クラスであると読んでいます。 ので、私はDelphi tstream:作成時に奇妙な動作が発生する
stream := TStream.Create();
なぜないでそれを作成しようとすると、コンパイラはエラーに行くと思いますか?
Delphi言語には抽象クラスの正式な概念はありません。
あなたが抽象するクラスを定義することができるというのは本当です:
type
TMyClass = class abstract
end;
しかし、あなたは完全によく、このクラスをインスタンス化することができます。実際には、Delphiのclass abstract
は、Delphi .netコンパイラが放棄したばかりの機能でしか使用されない機能です。
抽象クラスのより有効な定義は、abstract
メソッドを含むものです。このようなクラスをインスタンス化しようとすると、コンパイラの警告が出されます。これらの警告は、必要に応じて、コンパイラオプションを使用してエラーに昇格させることができます。
ドキュメントでは、TStream
が抽象的であると記載されている場合、それは実際には「概念的に」抽象的であることを意味します。実際にはそれにはabstract
メソッドがないので、上の私の定義では抽象的ではありません。
なぜTStream
に抽象メソッドが含まれていないのかわかりません。 GetSize
、SetSize
、Read
、Write
、Seek
は、実際にはabstract
と宣言する必要があります。私はクラスが今日設計されていれば、abstract
と宣言され、歴史的な理由ではないと思われます。
TStream
をインスタンシエートすることは、Delphi RTLであまり経験の浅いプログラマが行うよくある間違いです。間違いが数回行われると、レッスンは通常学習されます。残念なことに、このシステムには、このミスを簡単に報告する方法はありません。それぞれの新しいプログラマーはそれぞれ難しい方法を学ばなければなりません。
実際にそれらを使用しているプロジェクト(おそらく大きいプロジェクトや古いプロジェクト)に問題がある可能性があるため、抽象化する方法が変わっていないと思います。 –
@AlbertoMiola *クラスが今日設計されていれば、 'abstract'と宣言され、歴史的な理由からそうではない可能性があります。* –
@DavidHeffernan TStreamが抽象的に概念的に存在する場合、インスタンスは概念上のエラーです。私がそれを忘れてTStreamとそのメソッドを直接使用すると(つまり、TMemoryStreamメソッドではなく)、コードはうまく動作します。か否か? – user3083618