Delphi tstream: странное поведение при создании

Я новичок в Delphi. В документации класса TStrem я прочитал, что это абстрактный класс. Так что я думаю, что компилятор идет по ошибке, когда я пытаюсь создать его с

stream := TStream.Create();

Почему бы и нет?

1 ответ

Решение

В языке Delphi на самом деле нет формальной концепции абстрактного класса.

Это правда, что вы можете определить класс как абстрактный:

type
  TMyClass = class abstract
  end;

Но вы можете прекрасно создать экземпляр этого класса. по факту class abstract в Delphi это функция, используемая только давно заброшенным компилятором Delphi.net.

Более полезным определением абстрактного класса является тот, который содержит abstract методы. Если вы попытаетесь создать экземпляр такого класса, тогда будет выдано предупреждение компилятора. Эти предупреждения могут быть преобразованы в ошибки с помощью опции компилятора, если вы хотите.

Когда документация относится к TStream будучи абстрактным, оно фактически означает, что оно "концептуально" абстрактно. На самом деле это даже не имеет abstract методы, поэтому по моему определению выше это не абстрактно.

Я действительно не уверен, почему TStream не содержит абстрактных методов. Я бы предположил, что GetSize, SetSize, Read, Write а также Seek действительно должен быть объявлен abstract, Я подозреваю, что если бы класс разрабатывался сегодня, то он был бы объявлен abstract и, вероятно, они не по историческим причинам.

Инстанцирование TStream Это очень распространенная ошибка, допущенная программистами, менее опытными в Delphi RTL. Как только ошибка была сделана пару раз, урок обычно усваивается. К сожалению, система не предоставляет простого способа обозначить эту ошибку. Каждый новый программист просто должен учиться трудным путем.

Другие вопросы по тегам