Le langage Delphi n'a pas vraiment de concept formel de classe abstraite.
Il est vrai que vous pouvez définir une classe pour être abstraite:
type
TMyClass = class abstract
end;
Mais vous pouvez parfaitement instancier cette classe. En fait class abstract
dans Delphi est une fonctionnalité utilisée uniquement par le compilateur Delphi .net abandonné depuis longtemps.
Une définition plus utile d'une classe abstraite est celle qui contient les méthodes abstract
. Si vous essayez d'instancier une telle classe, un avertissement de compilateur sera émis. Ces avertissements peuvent être promus à des erreurs au moyen d'une option de compilateur, si vous le souhaitez. Lorsque la documentation mentionne TStream
comme étant abstraite, cela signifie en fait qu'elle est "conceptuellement" abstraite. En fait, il n'a même pas abstract
méthodes, donc par ma définition ci-dessus ce n'est pas abstrait.
Je ne sais pas vraiment pourquoi TStream
ne contient pas de méthodes abstraites. Je suggère que le GetSize
, SetSize
, Read
, Write
et Seek
devrait vraiment être déclaré abstract
. Je soupçonne que si la classe était conçue aujourd'hui, ils seraient déclarés abstract
et probablement ils ne sont pas pour des raisons historiques. L'instanciation TStream
est une erreur très courante commise par des programmeurs moins expérimentés dans le Delphi RTL. Une fois que l'erreur a été commise plusieurs fois, la leçon est généralement apprise. Malheureusement, le système ne permet pas facilement de signaler cette erreur. Chaque nouveau programmeur doit apprendre à la dure.
Je pense qu'ils ne changeront pas certaines méthodes pour abstrait parce qu'il pourrait y avoir des problèmes avec certains projets (peut-être grands et/ou anciens) qui les utilisent réellement –
@AlbertoMiola * Je soupçonne que si la classe était conçue aujourd'hui, ils être déclaré 'abstract' et probablement ils ne sont pas pour des raisons historiques. * –
@DavidHeffernan Si TStream est abstraitement conceptuellement, l'instance est aussi une erreur conceptuelle. Si je l'oublie et que j'utilise TStream et ses méthodes directement (pas les méthodes TMemoryStream), le code fonctionne bien. Ou pas? – user3083618